plsql代码中存在错误
请帮助我解决plsql中的此错误plsql代码中存在错误,plsql,syntax-error,Plsql,Syntax Error,请帮助我解决plsql中的此错误 sqlquery := 'SELECT COUNT(*) FROM V$SESSION WHERE STATUS = 'INACTIVE' AND LAST_CALL_ET > 0'; EXECUTE IMMEDIATE sqlquery into s_count; 以下是错误: ERROR at line 57: ORA-06550: line 57, column 66: PLS-00103: Encountered the symb
sqlquery := 'SELECT COUNT(*) FROM V$SESSION WHERE STATUS = 'INACTIVE' AND LAST_CALL_ET > 0';
EXECUTE IMMEDIATE sqlquery into s_count;
以下是错误:
ERROR at line 57:
ORA-06550: line 57, column 66:
PLS-00103: Encountered the symbol "INACTIVE" when expecting one of the following:
* & = - + ; < / > at in is mod remainder not rem
<an exponent (**)> <> or != or ~= >= <= <> and or like like2
like4 likec between || multiset member submultiset
The symbol "* was inserted before "INACTIVE" to continue.
ORA-06550: line 79, column 4:
PLS-00103: Encountered the symbol "EXCEPTION" when expecting one of the following:
( begin case declare else elsif end exit for goto if loop mod
null pragma raise return select update while with <an identifier> <a double-quoted
ORA-06550: line 81, column 7:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
end not pragma final instantiable order overriding static member constructor map
第57行的错误:
ORA-06550:第57行第66列:
PLS-00103:在预期以下情况时遇到符号“不活动”:
* & = - + ; < / > at in是mod余数而不是rem
或者!=或者~=>=在INACTIVE
周围的引号将字符串拆分并导致语法错误
sqlquery := 'SELECT COUNT(*) FROM V$SESSION WHERE STATUS = ''INACTIVE'' AND LAST_CALL_ET > 0';
EXECUTE IMMEDIATE sqlquery into s_count;
当然,如果语句实际上不是动态的,则不需要executeimmediate
,而是可以使用:
SELECT COUNT(*)
INTO s_count
FROM V$SESSION
WHERE STATUS = 'INACTIVE'
AND LAST_CALL_ET > 0';
具有立即执行功能的解决方案
set serveroutput on;
declare
l_status varchar2(30):= '''INACTIVE''';
s_count number:= 0;
sqlquery varchar2(32767) := null;
begin
sqlquery := 'SELECT COUNT(*) FROM V$SESSION WHERE STATUS = '||l_status||' AND LAST_CALL_ET > 0';
EXECUTE IMMEDIATE sqlquery into s_count;
dbms_output.put_line(s_count);
end;
请将查询更改为
sqlquery:=“从V$SESSION中选择COUNT(*),其中状态为”“不活动”“,最后一次调用\u ET>0';
在s_计数中执行即时sqlquery 使用以下查询:
sqlquery := 'SELECT COUNT(*) FROM V$SESSION WHERE STATUS = ''INACTIVE'' AND LAST_CALL_ET > 0';
像Chandra说的那样绑定变量
我喜欢的一种分配SQL的方法是:
declare
vSQL varchar2( 100 ) ;
begin
vSQL := q'[select 'done' from dual ]' ;
dbms_output.put_line( vSQL ) ;
end ;
所以你会这样做:
sqlquery := q'[SELECT COUNT(*) FROM V$SESSION WHERE STATUS = :status AND LAST_CALL_ET > 0]';
使用:
sqlquery:=“从V$SESSION中选择COUNT(*),其中状态为”“不活动”“和最后一次调用\u ET>0”
不是:
sqlquery:=“从V$SESSION中选择COUNT(*),其中状态为“INACTIVE”,最后一次调用\u ET>0”
使用此代码将非常有效
set serveroutput on
DECLARE
sqlquery varchar2(1000);
INACTIVE varchar2(100):='INACTIVE';
s_count number;
begin
sqlquery := 'SELECT COUNT(*) FROM V$SESSION WHERE STATUS = '''||INACTIVE||''' AND LAST_CALL_ET > 0';
EXECUTE IMMEDIATE sqlquery into s_count;
DBMS_OUTPUT.PUT_LINE(s_count);
end;
/
另一种方法是:
set serveroutput on;
DECLARE
sqlquery VARCHAR2(4000);
s_count number;
begin
sqlquery := 'SELECT COUNT(*) FROM V$SESSION WHERE STATUS = '||chr(39)||'INACTIVE'||chr(39)||' AND LAST_CALL_ET > 0';
EXECUTE IMMEDIATE sqlquery into s_count;
dbms_output.put_line('s_count--'||s_count);
end;
/
是否真的需要使用立即执行?查询不是动态的,因此您应该能够使用标准游标和打开
,获取
,来实现这一点,关闭
或a选择进入
这本质上是同一个问题,例如,这个问题似乎离题了,因为它是关于一个简单的打字错误。与请解释您的answerin sqlquery变量相同,您可以看到:a用作绑定变量。稍后,这些值在“使用l_状态执行即时sqlquery到s_计数”时通过使用l_状态传递。它与java中的PreparedStation类似,与传统的字符串连接相比,它也是安全的。
set serveroutput on
DECLARE
sqlquery varchar2(1000);
INACTIVE varchar2(100):='INACTIVE';
s_count number;
begin
sqlquery := 'SELECT COUNT(*) FROM V$SESSION WHERE STATUS = '''||INACTIVE||''' AND LAST_CALL_ET > 0';
EXECUTE IMMEDIATE sqlquery into s_count;
DBMS_OUTPUT.PUT_LINE(s_count);
end;
/
set serveroutput on;
DECLARE
sqlquery VARCHAR2(4000);
s_count number;
begin
sqlquery := 'SELECT COUNT(*) FROM V$SESSION WHERE STATUS = '||chr(39)||'INACTIVE'||chr(39)||' AND LAST_CALL_ET > 0';
EXECUTE IMMEDIATE sqlquery into s_count;
dbms_output.put_line('s_count--'||s_count);
end;
/