PLSQL缺少表达式

时间:2018-08-26 09:53:59

标签: sql oracle plsql dynamic-sql

有人可以告诉我为什么运行此脚本时出现以下错误:

DECLARE
    some_string VARCHAR2(30)    := 'Some String';
    V_CNT   NUMBER := null; 
    v_msg varchar2(4000) := ''; 
BEGIN
    v_msg := 'SELECT COUNT(*) INTO ' || V_CNT || ' FROM table_name WHERE column_name = ' || upper(some_string);
    execute immediate v_msg; 

    DBMS_OUTPUT.PUT_LINE(V_CNT);
END;
/

我得到的错误是:

ORA-00936: missing expression

3 个答案:

答案 0 :(得分:2)

看看这个例子(基于实际Scott的表和值,而不是通用的表和值)。基本上,EXECUTE IMMEDIATE应该看起来与众不同-同时使用USINGINTO。另外,无需声明变量 null (或空字符串)。

SQL> set serveroutput on;
SQL> declare
  2      some_string varchar2(30) := 'MANAGER';
  3      v_cnt       number;
  4      v_msg       varchar2(4000);
  5  begin
  6    v_msg := 'SELECT COUNT(*) FROM emp WHERE job = :a';
  7
  8    execute immediate v_msg into v_cnt using some_string;
  9
 10    dbms_output.put_line(v_cnt);
 11  end;
 12  /
3

PL/SQL procedure successfully completed.

SQL>

答案 1 :(得分:0)

用作以下内容

DECLARE
 some_string VARCHAR2(30)    := 'Some String';
 V_CNT   NUMBER := null; 
 v_msg varchar2(4000) := ''; 
BEGIN

     v_msg := 'SELECT COUNT(*)  
                 FROM table_name 
                WHERE column_name = ''' || upper(some_string)||''''; 
             -- more quotes needed, I'm printing result of the decent v_msg also.

     execute immediate v_msg into v_cnt; -- you should shift "into v_cnt" here.

     DBMS_OUTPUT.PUT_LINE(v_msg);
     ---> SELECT COUNT(*) FROM table_name WHERE column_name = 'Some String'
     DBMS_OUTPUT.PUT_LINE(v_cnt);    
END;

P.S。您可以如上所述获得结果,但我也建议您像@Littlefoot一样使用绑定变量(出于安全和性能方面的考虑)。

答案 2 :(得分:0)

与此相关的几个问题:

  1. V_CNTnull,并且您没有为其分配任何值,因此qwith部分变为:

    SELECT COUNT(*) INTO FROM
    

这会导致我认为错误。

  1. where子句中没有撇号,这也可能导致进一步的错误。您应该使用:

    'SELECT COUNT(*) INTO ' || V_CNT || ' FROM table_name WHERE column_name = ''' || upper(some_string) || '''';