Oracle 在一个plsql块中创建和使用表

Oracle 在一个plsql块中创建和使用表,oracle,plsql,ora-00942,Oracle,Plsql,Ora 00942,我正在尝试为oracle cloud control为长时间运行的语句创建用户定义的警报。所以,这就是为什么我不能在时钟执行之前执行一些特定的操作,比如创建所需的表。有一个问题: Error report - ORA-06550: line 32, column 10: PL/SQL: ORA-00942: table or view does not exist ORA-06550: line 30, column 5: PL/SQL: SQL Statement ignored 06550.

我正在尝试为oracle cloud control为长时间运行的语句创建用户定义的警报。所以,这就是为什么我不能在时钟执行之前执行一些特定的操作,比如创建所需的表。有一个问题:

Error report -
ORA-06550: line 32, column 10:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 30, column 5:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
当我运行这段代码时:

SET SERVEROUTPUT ON
DECLARE
    -- VARIABLES
    sql_id_var V$SESSION.sql_id%TYPE;
    SQL_CHILD_NUMBER_var  V$SESSION.SQL_CHILD_NUMBER%TYPE;
    ALREADY_EXISTS NUMBER := 0;

    --TO GET SQL_ID,CHILD_ID
    CURSOR  sql_id_cursor IS
    select ses.sql_id, ses.SQL_CHILD_NUMBER
    from V$SESSION ses
    where SES.STATUS = 'ACTIVE'
    and SES.USERNAME is not null
    --and Ses.AUDSID <> userenv('SESSIONID') 
    and ses.sql_id is not null
    and (SYSDATE - ses.SQL_EXEC_START) > 5/(24*60*60) --SECONDS;

begin

 --CREATE TABLE TO STORE SQL_ID OF LONG RUNNING QUERIES
 EXECUTE IMMEDIATE 'CREATE TABLE LONG_SQL (SQL_ID VARCHAR2(13),
                     SQL_CHILD_NUMBER NUMBER,
                     DETECTED_DATE DATE)' ;
  exception when others then
  if SQLCODE = -00955 then null;dbms_output.put_line( 'TABLE EXISTS ' ); else raise; end if;


  --PROCESSING EVERY LONG QUER
  FOR sql_id_row IN sql_id_cursor
  LOOP
    dbms_output.put_line( 'SQL_ID: ' || sql_id_row.sql_id || ' , SQL_CHILD_NUMBER: ' ||  sql_id_row.SQL_CHILD_NUMBER || ' , NOW IS :' || SYSDATE);
    SELECT COUNT(*)
    INTO ALREADY_EXISTS
    FROM LONG_SQL
    WHERE LONG_SQL.SQL_ID = sql_id_row.sql_id
    AND LONG_SQL.SQL_CHILD_NUMBER = sql_id_row.SQL_CHILD_NUMBER;
    dbms_output.put_line( 'SQL_ID: ' || sql_id_row.sql_id || ' , SQL_CHILD_NUMBER: ' ||  sql_id_row.SQL_CHILD_NUMBER || ' , FOUND ' || ALREADY_EXISTS || ' TIMES INTO LOG TABLE');

  END LOOP;


end;
/

在这个plsql中,如果表LONG_SQL不存在,我将创建它,然后我想进行一些使用这个新表的查询。你能在这里提出一些解决办法吗?是否可以在一个plsql块中创建并使用表?

那些靠动态SQL生活的人,都会死在动态SQL中

若您动态地创建了表,那个么您也必须动态地使用它。换句话说,此查询:

SELECT COUNT(*)
    INTO ALREADY_EXISTS
    FROM LONG_SQL ...

还必须是动态的,并使用executeimmediate执行。

那些靠动态SQL生活的人,都会死于动态SQL

若您动态地创建了表,那个么您也必须动态地使用它。换句话说,此查询:

SELECT COUNT(*)
    INTO ALREADY_EXISTS
    FROM LONG_SQL ...

还必须是动态的,并使用execute immediate执行。

为什么不将表创建为一次性操作,使其始终存在,而不是尝试动态处理事情?我想建议PL/SQL集合在您的情况下可能更好,但我不确定您要做什么。如果只运行一次并抛出结果,请不要使用表。如果要跟踪结果,请先创建一个表。@kfinity谢谢。对这是我的问题,因为我需要跟踪它们。@MT0因为我认为plsql非常强大,可以处理这个问题,而且它将在CC中的所有数据库上自动执行。是的,如果操作正确,pl/sql足够强大,可以处理它。但并非所有可以做的事情都应该做。正如其他人所说,正确的方法是在第一次执行过程之外和之前创建一次表。为什么不将表作为一次性操作创建,使其始终存在,而不是尝试动态处理?我想建议PL/SQL集合在您的情况下可能更好,但我不知道你想做什么。如果只运行一次并抛出结果,请不要使用表。如果要跟踪结果,请先创建一个表。@kfinity谢谢。对这是我的问题,因为我需要跟踪它们。@MT0因为我认为plsql非常强大,可以处理这个问题,而且它将在CC中的所有数据库上自动执行。是的,如果操作正确,pl/sql足够强大,可以处理它。但并非所有可以做的事情都应该做。正如其他人所说,正确的方法是在第一次执行过程之外和之前创建一次表。错误ORA-00904表示您使用了名称为CM726VMU2XD5X的列,但该列不存在于该表中。一般来说,您不应该从PL/SQL创建表。在SQL级别创建一次,并在需要的任何位置使用它们。错误ORA-00904表示您使用了名称为CM726VMU2XD5X的列,但该表中不存在该列。一般来说,您不应该从PL/SQL创建表。在SQL级别创建它们一次,并在任何需要的地方使用它们。