【问题标题】:Dynamic PL-SQL programming - Issue with DBMS_SQL.PARSE动态 PL-SQL 编程 - DBMS_SQL.PARSE 问题
【发布时间】: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 TABLEINSERT INTO 语句有效:您在整个INSERT INTO 语句中使用了“智能”引号,并且一行缺少引号,( 2)为了清楚,错误是动态SQL查询的语法,而不是生成它的代码,(3)为了更好地调试这个查询的生成,使用DBMS_OUTPUT写出@987654330的值@ 在您尝试解析它之前。这样您就可以看到您要运行的查询是什么。
  • 问题是SQL语句不正确,后缀为'OR'。所以,做了一个 RTRIM 来删除它,这个过程奏效了。

标签: sql oracle plsql dynamic-sql


【解决方案1】:

问题是 SQL 语句错误地添加了“OR”后缀。所以,做了一个 RTRIM 来删除它并且这个过程有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多