在oracle中实现表单动态查询和执行

在oracle中实现表单动态查询和执行,oracle,oracle10g,Oracle,Oracle10g,我想为drop和create视图形成一个动态查询并执行它 for C in Cursor LOOP ViewName :='View_'|| ID; DropViewSQL := DropViewSQL || 'DROP VIEW '||ViewName ||';' ; CreateViewSQL := CreateViewSQL || 'CREATE VIEW '|| ViewName ||' AS SELECT * from xyz;'; E

我想为drop和create视图形成一个动态查询并执行它

for C in Cursor  
LOOP 
ViewName :='View_'|| ID; 
DropViewSQL := DropViewSQL || 'DROP VIEW '||ViewName ||';' ; 
CreateViewSQL := CreateViewSQL || 'CREATE VIEW '|| ViewName ||' AS SELECT * from xyz;';                    
END LOOP; 
//在drop和create view之前要执行的一些Insert和update语句基本上我想在这些Insert和update语句之后创建一个新视图

DBMS_OUTPUT.PUT_LINE(DropViewSQL);
DBMS_OUTPUT.PUT_LINE(CreateViewSQL);

EXECUTE IMMEDIATE DropViewSQL;
EXECUTE IMMEDIATE CreateViewSQL;
这导致错误-PLS-00382:表达式类型错误

我想执行这个动态形成的查询

解决方案:

我使用数组而不是游标来存储结果集。执行了插入更新,然后在阵列上循环。
感谢您的建议。

您不能在一个
执行立即
调用中有多个语句;你需要在循环中调用它:

for C in Cursor
LOOP
  ViewName := 'View_'|| C.ID;
  DropViewSQL := 'DROP VIEW ' || ViewName ;
  CreateViewSQL := 'CREATE VIEW ' || ViewName || ' AS SELECT * from xyz';

  DBMS_OUTPUT.PUT_LINE(DropViewSQL);
  DBMS_OUTPUT.PUT_LINE(CreateViewSQL);

  EXECUTE IMMEDIATE DropViewSQL;
  EXECUTE IMMEDIATE CreateViewSQL;
END LOOP; 
请注意,动态SQL语句的结尾没有分号。您也可能不需要执行单独的
drop
步骤<代码>创建或替换视图
可能更合适,因为这样会保留授权

如果没有关于“在拖放和创建视图之前要执行的某些语句”部分的任何进一步信息,我们就不清楚这些语句应该放在哪里

但这并不能解释PLS-00382。您还没有显示什么是
光标
,我怀疑它不喜欢这样。由于
cursor
是一个保留字,所以您(希望)不会被称为该保留字,但不知道它是前面声明的显式游标,还是在此处执行查询的隐式游标。无论哪种方式,你都需要展示这是什么以及它在做什么。如果没有问题,那么可能是您删除的其他语句之一导致了错误。如果没有所有相关的代码和错误的行号,很难猜测


如果确实需要一起生成命令,然后在执行命令之前执行其他操作,则可以将它们存储在PL/SQL表中:

DECLARE
  cursor cur is select view_name as id from user_views;
    /* or whatever your real cursor is */
  type sqltab is table of varchar2(200);
  dropsqltab sqltab;
  createsqltab sqltab;
  viewname varchar2(30);
BEGIN
  dropsqltab := sqltab();
  createsqltab := sqltab();
  for C in cur
  LOOP
    ViewName := 'View_'|| C.ID;
    dropsqltab.extend();  
    dropsqltab(dropsqltab.count) := 'DROP VIEW ' || ViewName ;
    createsqltab.extend();  
    createsqltab(createsqltab.count) := 'CREATE VIEW ' || ViewName
      || ' AS SELECT * from xyz';
  END LOOP;

  /* other commands */

  FOR i IN 1 .. dropsqltab.count LOOP
    DBMS_OUTPUT.PUT_LINE(dropsqltab(i));
    DBMS_OUTPUT.PUT_LINE(createsqltab(i));
    EXECUTE IMMEDIATE dropsqltab(i);
    EXECUTE IMMEDIATE createsqltab(i);
  END LOOP; 
END;
/

您还没有说明drop/create语句和insert/update语句之间有什么关系(如果有)。如果它们是相关的,那么可以多次从PL/SQL表中提取值。如果没有,那么,我不理解对操作顺序的限制。

问题是我不能在循环本身中执行这些drop和create view命令,在此之前我需要执行一些插入和更新。。而且,我不能在这些语句之后循环这个,因为我在执行游标之后会在游标中丢失值。所以我需要形成drop和CREATEVIEW的查询,执行一些insert update,然后执行drop和CREATEVIEW查询。我的意思是说流是-1。表单放置n创建视图查询2。在创建新视图3之前,执行一些插入/更新操作(如所需)。然后执行drop n create视图queries@user1049021-请更新问题以显示您在创建和执行动态语句之间所做的操作。我恐怕不清楚为什么需要在这两个视图之间进行插入/更新(什么?)。@user1049021如果您正在重新创建同一个视图,为什么不将这两个
DDL
s简化为一个-
创建或替换视图
保留授予这些视图的所有特权(如果授予了任何特权)?