Plsql PL/SQL立即执行到游标中
我试图使用EXECUTE IMMEDIATE将其转换为游标 我得到了错误代码PLS-103 有机会这样做吗 我的光标Plsql PL/SQL立即执行到游标中,plsql,Plsql,我试图使用EXECUTE IMMEDIATE将其转换为游标 我得到了错误代码PLS-103 有机会这样做吗 我的光标 CURSOR myCursor(var IN VARCHAR2) IS v_query_string := 'SELECT Name FROM myDB WHERE Name LIKE '||var||';'; EXECUTE IMMEDIATE v_query_string; 我的回路 FOR c1 IN curquestanswersicd_hd_2(v_name) L
CURSOR myCursor(var IN VARCHAR2)
IS
v_query_string := 'SELECT Name FROM myDB WHERE Name LIKE '||var||';';
EXECUTE IMMEDIATE v_query_string;
我的回路
FOR c1 IN curquestanswersicd_hd_2(v_name)
LOOP
HTP.P(c1.name);
END LOOP;
在v_query_字符串中不需要只有select语句,而需要在其中包含整个FOR循环块
DECLARE
V_STRING VARCHAR2(1000) := 'BEGIN
FOR C1 IN (SELECT * FROM TAB) LOOP
--DO SOMETHING
END LOOP;
END;';
BEGIN
EXECUTE IMMEDIATE V_STRING;
END;
在v_query_字符串中不需要只有select语句,而需要在其中包含整个FOR循环块
DECLARE
V_STRING VARCHAR2(1000) := 'BEGIN
FOR C1 IN (SELECT * FROM TAB) LOOP
--DO SOMETHING
END LOOP;
END;';
BEGIN
EXECUTE IMMEDIATE V_STRING;
END;
如果需要按不同的查询字符串运行循环,则执行以下操作:
open for 'select 1 from dual' for my_cursor;
Loop
exit when my_cursor%NOTFOUND
end loop;
抱歉格式化,我是从手机发帖的 如果需要按不同的查询字符串运行循环,则执行以下操作:
open for 'select 1 from dual' for my_cursor;
Loop
exit when my_cursor%NOTFOUND
end loop;
抱歉格式化,我是从手机发帖的 不能执行游标声明的DML或PL/SQL代码透视。 只有SELECT语句对游标声明有效 请参阅 对于您的简单情况,不需要使用显式游标,出于性能原因,您应该使用封装在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;
不能执行游标声明的DML或PL/SQL代码洞察。 只有SELECT语句对游标声明有效 请参阅 对于您的简单情况,不需要使用显式游标,出于性能原因,您应该使用封装在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;