2015-04-17 124 views
2

我有一个表A有列A保存表名称值。 所有这些表都有一个共同的列C。我需要每个表格的这个列的最大值。PLSQL动态查询

我试过这个使用动态SQL,但我得到的错误。请建议。

DECLARE  
query1 VARCHAR2(100); 
c_table VARCHAR2(40); 
c_obj VARCHAR2(20); 
Cursor cursor_a IS 
SELECT a FROM A; 
BEGIN 
Open cursor_a; 
    LOOP 
     Fetch cursor_a INTO c_table2;  
     EXIT WHEN cursor_a%notfound;  
     query1 := 'SELECT max(object_ref) AS "c_obj" FROM c_table' ; 
     EXECUTE IMMEDIATE query1; 
     dbms_output.put_line('Maximum value: '|| c_table || c_obj); 
    END LOOP; 
Close cursor_a; 
END; 
+0

“*,但得到的错误*” - 和错误? –

回答

-4

有在veriables一些错过的比赛,你曾使用过即

  1. 声明为 “c_table”,但访问为 “c_table2
  2. 每个表常见的列名是“ C“但是作为”object_ref“访问
  3. 在动态查询中SE INTO关键字的值存储到您的varibale

建议

  1. 使用CONCAT()函数来准备查询动态即是这样的:

    SET @SQL: = CONCAT('SELECT max(c)INTO',c_obj,'FROM',c_table);实现动态查询

  2. 步骤是:

    SET @SQL = <your dynamic query> 
    PREPARE stmt FROM @SQL; 
    EXECUTE stmt; 
    

示例代码:

DECLARE  
query1 VARCHAR2(100); 
c_table VARCHAR2(40); 
c_obj VARCHAR2(20); 
CURSOR cursor_a IS 
SELECT a FROM A; 
BEGIN 
OPEN cursor_a; 
    LOOP 
     FETCH cursor_a INTO c_table;  
     EXIT WHEN cursor_a%notfound; 
     SET @SQL := CONCAT('SELECT max(object_ref) AS c_obj INTO ', c_obj, ' FROM ',c_table); 
    PREPARE stmt FROM @SQL;   
    EXECUTE stmt;  
    dbms_output.put_line('Maximum value: '|| c_table || c_obj); 
    END LOOP; 
CLOSE cursor_a; 
END; 
+0

这是无效的Oracle PL/SQL语法 – APC

+0

是的它是运行动态查询的示例方式(参考语法:用于MySQL兼容),您根据使用的数据库进行需求更改,即Oracle –

+1

StackOverflow有很多MySQL问题。为什么不回答一些呢?除非您想以此为契机,通过用实际符合OP要求**的解决方案回答问题来自学Oracle PL/SQL。 – APC

2

动态SQL不能看到你的PL/SQL变量:你需要传递它是一个可以在SQL引擎范围内执行的字符串。因此,你需要用下面的语句的样板文本来连接表名:

query1 := 'SELECT max(c) FROM ' || variable_name; 

您还需要查询的结果返回到一个变量。

这里是它是如何工作(我从你的榜样剥离掉一些不必要的代码):

DECLARE  
c_table VARCHAR2(40); 
c_obj VARCHAR2(20); 
BEGIN 
    for lrec in (select a as tab_name from A) 
    LOOP 
     EXECUTE IMMEDIATE 'SELECT max(object_ref) FROM ' || lrec.tab_name 
      into c_obj ; 
     dbms_output.put_line('Maximum value: '|| lrec.tab_name 
      || '='|| c_obj); 
    END LOOP; 
END; 
+0

由于OP的陈述“*所有这些表都有一个共同的列'C' *”它应该是'EXECUTE IMMEDIATE'SELECT max(C)FROM'|| lrec.tab_name转换成c_obj;' –

+0

@Wernfried - 好点 – APC