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

请帮助我解决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 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;
            /