gpt4 book ai didi

plsql - 将值分配给 rowtype 的字段,其中 `field name` 是字符串

转载 作者:行者123 更新时间:2023-12-04 20:43:37 26 4
gpt4 key购买 nike

我想为 rowtype 的字段赋值,但我不知道该怎么做。

假设我的数据库中有一个表 X。

还假设我有以下变量

  • a ( X%ROWTYPE ),代表表 X
  • 的一行
  • b ( VARCHAR2 ),包含表 X
  • 的列名
  • c ( VARCHAR2 ),包含我想存储在 a.b 中的内容

  • 我想做的是:类似 a.b := c .

    我想出了这样的事情:
    EXECUTE IMMEDIATE 'SELECT '|| c || ' INTO a.' || b || ' FROM DUAL';

    显然,这不是正确的做法。我得到一个 ORA-0095: 缺少关键字 错误。

    谁能帮我这个 ?

    这是完整的代码:
    DECLARE
    tRow MyTable%ROWTYPE;
    col_name VARCHAR(10) := 'Length';
    nValue NUMBER(12,4) := 0.001;
    dynamic_request VARCHAR(300);
    BEGIN
    dynamic_request := 'SELECT '|| nValue || ' INTO tRow.' || col_name || ' FROM DUAL';
    EXECUTE IMMEDIATE dynamic_request;
    END;

    最佳答案

    好的,我解决了!

    简答:使用全局变量可以解决问题

    答案开发

    让我们考虑关于动态 PL/SQL 块的两个事实(即,PL/SQL 块写为字符串,通过 EXECUTE IMMEDIATE 语句执行)

    [1] 创建动态 PLSQL 块时,没有变量作用域之类的东西。我的意思是,如果你做这样的事情:

    CREATE OR REPLACE PROCEDURE DynamicVariableAssignment(
    theString IN VARCHAR2
    )
    IS
    BEGIN
    EXECUTE IMMEDIATE 'BEGIN theString := ''test''; END; ';
    END;

    它根本不起作用,因为 theString 的范围不会传输到动态 PL/SQL 块。换句话说,无论在何处执行,动态 PL/SQL 块都不会“继承”任何变量。

    [2] 您可能会说“好吧,别慌,我可以为我的动态 PL/SQL 块提供输入/输出参数,对吧?”。当然可以,但你猜怎么着:你只能给 SQL 类型输入/输出!另一方面,真正的 PL/SQL 类型,例如 myTable%rowtype , 不被接受作为动态 PL/SQL 块的输入。所以 hmmftg 的答案也不起作用:
    -- I've reduced the code to the interesting part
    dynamic_request := 'BEGIN :t_row.' || col_name || ':= 0.001; END;';
    EXECUTE IMMEDIATE dynamic_request USING IN OUT tRow;
    -- (where tRow is of type myTable%ROWTYPE)

    tRow属于 MyTable%ROWTYPE,它不是有效的 SQL 类型,因此不能作为动态 PL/SQL 块的输入。

    解决方案 谁会想到全局变量会来拯救这一天?正如我们在 中所说的[1] ,我们没有引用动态 PL/SQL 块之外的任何变量。但是我们仍然可以访问包头中定义的全局变量!

    让我们假设我有一个包 kingPackage其中我定义了以下内容:
    tempVariable  myTable%ROWTYPE;

    然后我可以这样做:

    最终代码(仅限正文)
    -- Copy tRow into temp variable
    kingPackage.tempVariable := tRow;

    -- We modify the column of the temp variable
    vString := 'BEGIN kingPackage.tempVariable.' || col_val || ' := ' || TO_CHAR(vNumber) ||'; END;';
    EXECUTE IMMEDIATE vString;

    -- The column value has been updated \o/
    tRow := kingPackage.tempVariable;

    你去吧,伙计们!
    祝你今天过得愉快

    关于plsql - 将值分配给 rowtype 的字段,其中 `field name` 是字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21607313/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com