暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 无效的插入SQL Vs PL/SQL & 12c Vs 11g

askTom 2017-04-02
437

问题描述

嗨,团队,

最近,我们在生产系统中遇到了一个错误 (这是我们的编码错误!),但是在调查相同的内容时,我注意到了这一点。

执行以下操作:
1) 表创建:
create table dept( 
dept_no varchar2(15), 
dept_name varchar2(30), 
loc varchar2(30));


2) SQL插入:
insert into dept values ('10','president's','washington d.c');


3) PL/SQL插入:
DECLARE 
l_sql VARCHAR2(32767); 
BEGIN 
  l_sql := 'INSERT INTO DEPT VALUES ('; 
  L_sql := l_sql || '''50'''; 
  l_sql := l_sql ||', ''president''s'', ''washington d.c'')'; 
  dbms_output.put_line(l_sql); 
  EXECUTE IMMEDIATE l_sql; 
END;


当我在11g和12c中运行上述SQL和PL/SQL插入时收到的错误代码如下:

Version      - 12c
SQL Error    - ORA-00917: missing comma
PL/SQL Error - ORA-00917: missing comma ORA-06512: at line 8
               ORA-06512: at "SYS.DBMS_SQL", line 1721

Version      - 11g
SQL Error    - ORA-01756: quoted string not properly terminated
PL/SQL Error - ORA-00917: missing comma ORA-06512: at line 8


我们得到的错误在12c版本的SQL和PL/SQL中是统一的,但我个人认为11g SQL错误更有意义,有助于确定错误的根本原因。
请告诉我你的观点。

专家解答

我同意如果PL/SQL消息与SQL消息匹配会很好,但是很抱歉,我无法重现您提到的11g和12c之间的差异。

SQL> select banner from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for 64-bit Windows: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

5 rows selected.

SQL>
SQL> create table dept(
  2  dept_no varchar2(15),
  3  dept_name varchar2(30),
  4  loc varchar2(30));

Table created.

SQL>
SQL> insert into dept values ('10','president's','washington d.c');
ERROR:
ORA-01756: quoted string not properly terminated


SQL>
SQL> declare
  2  l_sql varchar2(32767);
  3  begin
  4    l_sql := q'{insert into dept values ('10','president's','washington d.c')}';
  5    execute immediate l_sql;
  6  end;
  7  /
declare
*
ERROR at line 1:
ORA-00917: missing comma
ORA-06512: at line 5

SQL> select banner from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
CORE    12.2.0.1.0      Production
TNS for 64-bit Windows: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production

5 rows selected.

SQL>
SQL> create table dept(
  2  dept_no varchar2(15),
  3  dept_name varchar2(30),
  4  loc varchar2(30));

Table created.

SQL>
SQL> insert into dept values ('10','president's','washington d.c');
ERROR:
ORA-01756: quoted string not properly terminated


SQL>
SQL> declare
  2  l_sql varchar2(32767);
  3  begin
  4    l_sql := q'{insert into dept values ('10','president's','washington d.c')}';
  5    execute immediate l_sql;
  6  end;
  7  /
declare
*
ERROR at line 1:
ORA-00917: missing comma
ORA-06512: at line 5



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论