从游标值执行 SQL
Execute SQL from cursor value
(只是为了先发制人 - 我知道这种方法是多么的笨拙和有缺陷。它只是个人使用的东西,可以使某项任务更容易。)
对于此示例,我想创建两个动态 SQL 插入语句,将 ALL_TABLES 的前两个结果插入 GT_DUMMY,并用输入值填充。
CREATE GLOBAL TEMPORARY TABLE GT_DUMMY
( Test_Field VARCHAR(100)
);
CREATE OR REPLACE PROCEDURE LOAD_GT_DUMMY
( Insert_String VARCHAR
)
IS
BEGIN
FOR col IN
( SELECT 'INSERT INTO GT_DUMMY VALUES(' || CHR(39) || Insert_String || Table_Name || CHR(39) || ');' AS insertStatement
FROM ALL_TABLES
WHERE ROWNUM <= 2
) LOOP
DBMS_OUTPUT.put_line(col.insertStatement);
-- Result of EXEC LOAD_GT_DUMMY('SOMETHING'); :
-- INSERT INTO GT_DUMMY VALUES('SOMETHINGDUAL');
-- INSERT INTO GT_DUMMY VALUES('SOMETHINGSYSTEM_PRIVILEGE_MAP');
-- This command fails when
EXECUTE IMMEDIATE col.insertStatement;
END LOOP;
END;
插入格式正确,如果我 运行 它们独立执行,则插入会执行,但 EXECUTE IMMEDIATE col.insertStatement;命令不起作用。该过程编译,但是当我尝试 运行
EXEC LOAD_GT_DUMMY('SOMETHING');
我收到一个错误
ORA-00933: SQL command not properly ended
ORA-06512: at "MY_SCHEMA.LOAD_GT_DUMMY", line 14
ORA-06512: at line 1
有什么想法吗?我的语法关闭了吗?
最佳。
删除终止分号;动态 SQL 不喜欢。
SELECT 'INSERT INTO GT_DUMMY VALU... <snip> ... || CHR(39) || ');'
^
|
here
尝试在 EXECUTE
语句末尾使用 INTO v_result
EXECUTE IMMEDIATE col.insertStatement INTO v_result;
P.S。不要忘记声明 v_result
变量
类似的例子你可以往下看here
删除sql语句中的冒号并执行即可
FOR col IN
( SELECT 'INSERT INTO GT_DUMMY VALUES(' || CHR(39) || Insert_String || Table_Name || CHR(39) || ')' AS insertStatement
FROM ALL_TABLES
WHERE ROWNUM <= 2
) LOOP
(只是为了先发制人 - 我知道这种方法是多么的笨拙和有缺陷。它只是个人使用的东西,可以使某项任务更容易。)
对于此示例,我想创建两个动态 SQL 插入语句,将 ALL_TABLES 的前两个结果插入 GT_DUMMY,并用输入值填充。
CREATE GLOBAL TEMPORARY TABLE GT_DUMMY
( Test_Field VARCHAR(100)
);
CREATE OR REPLACE PROCEDURE LOAD_GT_DUMMY
( Insert_String VARCHAR
)
IS
BEGIN
FOR col IN
( SELECT 'INSERT INTO GT_DUMMY VALUES(' || CHR(39) || Insert_String || Table_Name || CHR(39) || ');' AS insertStatement
FROM ALL_TABLES
WHERE ROWNUM <= 2
) LOOP
DBMS_OUTPUT.put_line(col.insertStatement);
-- Result of EXEC LOAD_GT_DUMMY('SOMETHING'); :
-- INSERT INTO GT_DUMMY VALUES('SOMETHINGDUAL');
-- INSERT INTO GT_DUMMY VALUES('SOMETHINGSYSTEM_PRIVILEGE_MAP');
-- This command fails when
EXECUTE IMMEDIATE col.insertStatement;
END LOOP;
END;
插入格式正确,如果我 运行 它们独立执行,则插入会执行,但 EXECUTE IMMEDIATE col.insertStatement;命令不起作用。该过程编译,但是当我尝试 运行
EXEC LOAD_GT_DUMMY('SOMETHING');
我收到一个错误
ORA-00933: SQL command not properly ended
ORA-06512: at "MY_SCHEMA.LOAD_GT_DUMMY", line 14
ORA-06512: at line 1
有什么想法吗?我的语法关闭了吗?
最佳。
删除终止分号;动态 SQL 不喜欢。
SELECT 'INSERT INTO GT_DUMMY VALU... <snip> ... || CHR(39) || ');'
^
|
here
尝试在 EXECUTE
语句末尾使用 INTO v_result
EXECUTE IMMEDIATE col.insertStatement INTO v_result;
P.S。不要忘记声明 v_result
变量
类似的例子你可以往下看here
删除sql语句中的冒号并执行即可
FOR col IN
( SELECT 'INSERT INTO GT_DUMMY VALUES(' || CHR(39) || Insert_String || Table_Name || CHR(39) || ')' AS insertStatement
FROM ALL_TABLES
WHERE ROWNUM <= 2
) LOOP