首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一个plsql块中创建和使用表

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

Stack Overflow用户
提问于 2020-02-26 13:23:18
回答 1查看 196关注 0票数 0

我试图为长期运行的语句为oracle云控制创建一个用户定义的警报。这就是为什么我不能在执行时钟之前执行一些特定的操作(比如创建必需的表)。有一个问题:

代码语言:javascript
复制
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:

当我运行这段代码时:

代码语言:javascript
复制
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块中创建并使用表?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-26 13:30:43

那些依靠动态SQL生存的人,死于动态SQL。

如果动态创建表,则还必须动态使用它。换句话说,这个查询:

代码语言:javascript
复制
SELECT COUNT(*)
    INTO ALREADY_EXISTS
    FROM LONG_SQL ...

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60414957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档