动态 PL-SQL 编程 - DBMS_SQL.PARSE 问题

Dynamic PL-SQL programming - Issue with DBMS_SQL.PARSE

我使用一些业务逻辑编写了一个查询来获取详细信息。但是,我卡在了下面的行

  DBMS_SQL.PARSE(CUR, SQLSTR, DBMS_SQL.NATIVE);

我收到以下错误。我一次又一次地检查了语法,它完全没问题。那么,你们能帮我解决这个问题吗?以下错误。

 ORA-00933: SQL command not properly ended
 ORA-06512: at "SYS.DBMS_SQL", line 1134
 ORA-06512: at line 35
 0093.00000 - "SQL command not properly ended"

代码如下。

DECLARE 

SQLSTR VARCHAR2(30000);
CUR INTEGER;
SER INTEGER;
WS  VARCHAR2(10);
REFCUR SYS_REFCURSOR;
TYPE ERMAS IS TABLE OF DUAL%ROWTYPE;
SERULT ERMAS;
VAL MRUL.OWL%TYPE;

CURSOR TION IS
SELECT RUD.COL, RUD.VAL, RUD.OPR, RUD.RU3
FROM RMAP RUM, RDET RUD 
WHERE RUM.RU3 = RUD.RU3
AND RUD.RU3 IN ('60', '61', '62');

 BEGIN

CUR := DBMS_SQL.OPEN_CURSOR;

SQLSTR := 'SELECT * '||CHR(13);
SQLSTR := SQLSTR || 'FROM DUAL '||CHR(13);    
SQLSTR := SQLSTR || 'WHERE MRUL = : OWL AND (';

FOR DONC IN TION
LOOP
    SQLSTR := SQLSTR || DONC.COL || DONC.OPR||':'|| DONC. RU3 ||'OR ';
END LOOP;

SQLSTR := REGEXP_REPLACE(SQLSTR, 'OR ', ')');

DBMS_SQL.PARSE(CUR, SQLSTR, DBMS_SQL.NATIVE);

SELECT OWL
INTO VAL
FROM MRUL
WHERE RU2 = '20';

DBMS_SQL.BIND_VARIABLE(CUR, ':OWL', WS);

FOR DONC IN TION
LOOP
  DBMS_SQL.BIND_VARIABLE(CUR, ':'|| DONC.RU3, DONC. VAL);
END LOOP;

SER := DBMS_SQL.EXECUTE(CUR);  
REFCUR := DBMS_SQL.TO_REFCURSOR(CUR);

FETCH REFCUR BULK COLLECT INTO SERULT;


END;

正在更新创建和插入查询。

 CREATE TABLE RDET
 (
 COL VARCHAR2(50) NOT NULL,
 VAL VARCHAR2(50) NOT NULL,
 OPR VARCHAR2(50) NOT NULL,
 RU3 VARCHAR2(50) NOT NULL
 );

 CREATE TABLE RMAP
 (
 RU2 VARCHAR2(50) NOT NULL,
 RU3 VARCHAR2(50) NOT NULL
 );

 CREATE TABLE MRUL
 (
 OWL VARCHAR2(50) NOT NULL,
 RU2 VARCHAR2(50) NOT NULL
 );

 INSERT INTO RDET
 VALUES (‘DELHI’, ‘CITY’, ‘=’, ‘60’);
 INSERT INTO RDET
 VALUES (‘SHIMLA’, ‘VILLAGE’, ‘<>’, ‘61’);
 INSERT INTO RDET
 VALUES (‘NOIDA’, ‘TOWN’, ‘=’, ‘62’);

 INSERT INTO RMAP
 VALUES (‘20’, ‘60’);
 INSERT INTO RMAP
 VALUES (‘21’, ‘61’);
 INSERT INTO RMAP
 VALUES (‘21’, ‘62’);

 INSERT INTO MRUL
 VALUES (‘COUNTRY’, ‘20’);
 INSERT INTO MRUL
 VALUES (‘CONTINENT, ‘21’);
 INSERT INTO MRUL
 VALUES (‘AREA’, ‘22’);
 INSERT INTO MRUL
 VALUES (‘AREA’, ‘23’);

问题是 SQL 语句的后缀不正确 'OR'。所以,做了一个 RTRIM 来删除它并且程序有效。