有人可以告诉我为什么运行此脚本时出现以下错误:
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
答案 0 :(得分:2)
看看这个例子(基于实际Scott的表和值,而不是通用的表和值)。基本上,EXECUTE IMMEDIATE
应该看起来与众不同-同时使用USING
和INTO
。另外,无需声明变量 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)
与此相关的几个问题:
V_CNT
是null
,并且您没有为其分配任何值,因此qwith部分变为:
SELECT COUNT(*) INTO FROM
这会导致我认为错误。
where
子句中没有撇号,这也可能导致进一步的错误。您应该使用:
'SELECT COUNT(*) INTO ' || V_CNT || ' FROM table_name WHERE column_name = ''' || upper(some_string) || '''';