我尝试将EXECUTE IMMEDIATE
用于CURSOR
。
我收到错误代码PLS-103
有没有机会这样做?
我的光标
CURSOR myCursor(var IN VARCHAR2)
IS
v_query_string := 'SELECT Name FROM myDB WHERE Name LIKE '||var||';';
EXECUTE IMMEDIATE v_query_string;
My Loop
FOR c1 IN curquestanswersicd_hd_2(v_name)
LOOP
HTP.P(c1.name);
END LOOP;
答案 0 :(得分:2)
如果你需要通过不同的查询字符串运行循环到cab,请执行下一步:
open for 'select 1 from dual' for my_cursor;
Loop
exit when my_cursor%NOTFOUND
end loop;
抱歉格式化,我是通过手机发布的。
答案 1 :(得分:2)
您无法执行CURSOR
声明的DML或PL / SQL代码洞察。
只有SELECT
语句对CURSOR
声明有效。
请参阅http://docs.oracle.com/database/121/LNPLS/explicit_cursor.htm#LNPLS01313
对于你的简单情况,使用显式游标并不是必需的,出于性能原因,你应该使用一个包含在FOR-LOOP中的隐式游标:
示例代码:
SET SERVEROUTPUT ON;
SET FEEDBACK OFF;
CLEAR;
-- Create a test table
CREATE TABLE MYDB (
ID NUMBER,
NAME VARCHAR2(255)
);
-- Insert some test values
INSERT INTO mydb (id,name) VALUES(1,'Oracle 11g Enterprise');
INSERT INTO mydb (id,name) VALUES(2,'Oracle 11g XP');
INSERT INTO mydb (id,name) VALUES(3,'Oracle 12c Enterprise');
INSERT INTO mydb (id,name) VALUES(4,'Oracle 12c XP');
INSERT INTO mydb (id,name) VALUES(5,'MongoDB');
INSERT INTO mydb (id,name) VALUES(6,'Postgres');
-- and commit.
COMMIT;
-- Create the procedure
CREATE OR REPLACE PROCEDURE MYDBNAMES(P_NAME_SNIPPET IN VARCHAR2) IS
V_NAME VARCHAR2(256);
BEGIN
FOR C1 IN (SELECT NAME
FROM MYDB
WHERE NAME LIKE P_NAME_SNIPPET) LOOP
DBMS_OUTPUT.PUT_LINE(C1.NAME); -- <- HTP.P(C1.NAME);
END LOOP;
END;
/
SHOW ERRORS;
--Execute procedure
EXECUTE MYDBNAMES('%11%');
-- Clean up
DROP PROCEDURE MYDBNAMES;
DROP TABLE MYDB;
输出:
Oracle 11g Enterprise
Oracle 11g XP
SQL>
答案 2 :(得分:0)
您需要在其中包含整个v_query_string
循环块,而不是只在FOR
中使用select语句。
DECLARE
V_STRING VARCHAR2(1000) := 'BEGIN
FOR C1 IN (SELECT * FROM TAB) LOOP
--DO SOMETHING
END LOOP;
END;';
BEGIN
EXECUTE IMMEDIATE V_STRING;
END;