【发布时间】:2021-10-25 18:19:33
【问题描述】:
我使用一些业务逻辑编写了一个查询来获取详细信息。但是,我卡在下面一行
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’);
【问题讨论】:
-
好吧,你使用的列名肯定是错误的。
3RU在 Oracle 中是无效的列名,除非您在创建它时使用了双引号。首先修复该问题(或发布测试用例 - CREATE TABLE 和 INSERT INTO 语句 - 以便我们知道我们正在处理什么)。 -
@Littlefoot 为了更好地理解需求,我放了 create table 和 insert table 语句。
-
一些事情:(1)请确保您的
CREATE TABLE和INSERT INTO语句有效:您在整个INSERT INTO语句中使用了“智能”引号,并且一行缺少引号,( 2)为了清楚,错误是动态SQL查询的语法,而不是生成它的代码,(3)为了更好地调试这个查询的生成,使用DBMS_OUTPUT写出@987654330的值@ 在您尝试解析它之前。这样您就可以看到您要运行的查询是什么。 -
问题是SQL语句不正确,后缀为'OR'。所以,做了一个 RTRIM 来删除它,这个过程奏效了。
标签: sql oracle plsql dynamic-sql