动态 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 来删除它并且程序有效。
我使用一些业务逻辑编写了一个查询来获取详细信息。但是,我卡在了下面的行
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 来删除它并且程序有效。