Plsql PL/SQL立即执行到游标中

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

我试图使用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)
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;