gpt4 book ai didi

sql - 将 EXECUTE IMMEDIATE 与带有变量的连接字符串一起使用

转载 作者:行者123 更新时间:2023-12-04 05:32:14 25 4
gpt4 key购买 nike

这个问题是关于不允许“创建”权限的环境。
版本是:
Oracle 数据库 10g 和 PL/SQL 8.0.0.1480

下面是一个小示例,展示了我正在尝试完成的任务,即循环遍历集合中的一组“字段”并用一些值填充它们。每个“字段”都有相同的根名称“MyCol_”,后跟一个数字。

例如:MyCol_1、MyCol_2、...、MyCol_n。

我能够建立我的串联,但我无法获得 立即执行 工作。

我可以在“MyCol_1”是硬编码值的情况下运行这些行:

MyCol_1.EXTEND;        
MyCol_1(1) := 'abc';

但是当我用一个连接的字符串替换那些硬编码的值时它失败了
v_LoopCounter:=1;        
v_MyTestCode := 'MyCol_' || v_LoopCounter || '.EXTEND' ;
DBMS_OUTPUT.PUT_LINE('Present value of v_MyTestCode: '||v_MyTestCode);
execute immediate v_MyTestCode; -- <<<-- ERRORS ON THIS LINE <<<--

出现的错误是:
ORA-00900: 无效的 SQL 语句

我试图遵循本网站给出的建议:
http://docs.oracle.com/cd/B10501_01/appdev.920/a97269/pc_13dyn.htm

...store the dynamic SQL statement in a character string, which must be a host variable or quoted literal. When you store the SQL statement in the string, omit the keywords EXEC SQL and the ';' statement terminator.



还有来自以下方面的建议:
http://www.databasejournal.com/features/oracle/article.php/2109681/EXECUTE-IMMEDIATE-option-for-Dynamic-SQL-and-PLSQL.htm

我在 EXECUTE IMMEDIATE 上尝试了许多变体,例如 EXEC、EXECUTE,但都没有成功。

这是完整的代码示例。这只是一些用于尝试调试此问题的测试版代码。我希望这不会分散关于将 EXECUTE IMMEDIATE 与连接字符串一起使用的问题。我试图保持示例代码简单且有据可查。希望这有助于解释这种情况。
DECLARE

TYPE MyNestedTable IS TABLE of varchar2(100);

MyCol_1 MyNestedTable;
MyCol_2 MyNestedTable;

v_LoopCounter NUMBER;

v_MyTestCode VARCHAR2(200);
v_SomeValue VARCHAR2(200);

BEGIN

MyCol_1 := MyNestedTable();
MyCol_2 := MyNestedTable();

v_LoopCounter:=1;

v_MyTestCode := 'MyCol_' || v_LoopCounter || '.EXTEND' ;
DBMS_OUTPUT.PUT_LINE('Present value of v_MyTestCode: '||v_MyTestCode);
EXECUTE IMMEDIATE v_MyTestCode; -- <<<-- ERRORS ON THIS LINE <<<--

v_SomeValue := 'abc';
v_MyTestCode := 'MyCol_' || v_LoopCounter || ':= '||v_SomeValue;
DBMS_OUTPUT.PUT_LINE('Present value of v_MyTestCode: '||v_MyTestCode);
EXECUTE IMMEDIATE v_MyTestCode; -- <<<-- ERRORS ON THIS LINE <<<--


MyCol_2.EXTEND;
MyCol_2(1) := 200;
DBMS_OUTPUT.PUT_LINE('MyCol_2 '||MyCol_2(1));
DBMS_OUTPUT.PUT_LINE('MyCol_1 '|| ', '||'MyCol_2 '); DBMS_OUTPUT.PUT_LINE(MyCol_1(1)|| ', '||MyCol_2(1));

END;

最佳答案

Collection.EXTEND不是 SQL就其整体而言,它是一个用于扩展集合的 PLSQL 语句。话虽如此,下面的代码将永远无法工作-

v_LoopCounter:=1;        
v_MyTestCode := 'MyCol_' || v_LoopCounter || '.EXTEND' ;
execute immediate v_MyTestCode;

但是,如果动态 sql 是整个 PLSQL stub /匿名块, EXECUTE IMMEDIATE将致力于此。喜欢
v_LoopCounter:=1;        
v_MyTestCode := 'begin MyCol_' || v_LoopCounter || '.EXTEND;end;' ;
execute immediate v_MyTestCode;

这可能会达到目的,但如果上述内容是从存储过程本身完成的,那么 .EXTEND 的范围有问题(即未经测试)。您可以尝试看看它是否有效。

关于sql - 将 EXECUTE IMMEDIATE 与带有变量的连接字符串一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12431135/

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