使用动态SQL的游标

时间:2014-11-29 21:06:28

标签: sql oracle dynamic input cursor

我正在尝试在Oracle中创建一个简单的游标,它将循环遍历表的列并存储列名和数据类型。我想使用输入动态表名称。在尝试编译过程(未声明的变量等)时,我收到了大量不同的错误消息。我必须把我的基本结构弄错。这就是我到目前为止所做的:

CREATE OR REPLACE PROCEDURE DV
(
TABLENAME IN VARCHAR2
)
 authid current_user

AS

  sql_qx varchar2(5000);
  curTab varchar2(5000);
  curCol varchar2(5000);
  curTyp varchar2(5000);


  BEGIN

  sql_qx := 'DECLARE CURSOR tblCur IS 
              SELECT table_name,
                    column_name,
                    data_type
              FROM  user_tab_columns
              WHERE table_name =  ''' || TABLENAME || '''';

  execute immediate sql_qx;


    IF NOT tblCur%ISOPEN THEN
    OPEN tblCur;
    END IF;

    FETCH tblCur INTO curTab, curCol, curTyp;
    WHILE tblCur%FOUND THEN
      LOOP

         dbms_output.put_line(tblCur.curTab || ' ' ||tblCur.curCol || ' ' ||tblCur.curTyp); 

   FETCH tblCur INTO curTab, curCol, curTyp;

   END LOOP;
   END DV;

1 个答案:

答案 0 :(得分:0)

试试这个:

CREATE OR REPLACE PROCEDURE DV (TABLENAME IN VARCHAR2) authid current_user
AS
  curTab varchar2(5000);
  curCol varchar2(5000);
  curTyp varchar2(5000);

  CURSOR tblCur IS 
    SELECT table_name, column_name, data_type
    FROM  user_tab_columns
    WHERE table_name = TABLENAME;

BEGIN
    IF NOT tblCur%ISOPEN THEN
        OPEN tblCur;
    END IF;

    LOOP
        FETCH tblCur INTO curTab, curCol, curTyp;
        EXIT WHEN tblCur%NOTFOUND;
        dbms_output.put_line(curTab || ' ' || curCol || ' ' || curTyp); 
    END LOOP;
END DV;

你甚至不需要一个明确的光标:

CREATE OR REPLACE PROCEDURE DV (TABLENAME IN VARCHAR2) authid current_user
AS
BEGIN
    FOR c IN (SELECT table_name, column_name, data_type
              FROM  user_tab_columns
              WHERE table_name = TABLENAME) 
    LOOP
        dbms_output.put_line(c.table_name || ' ' || c.column_name || ' ' || c.data_type); 
    END LOOP;
END DV;