PL / SQL EXECUTE立即进入游标

时间:2016-02-02 17:27:51

标签: plsql

我尝试将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;

3 个答案:

答案 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;