【问题标题】:Cursor Using Dynamic SQL使用动态 SQL 的游标
【发布时间】:2015-01-28 04:51:50
【问题描述】:

我正在尝试在 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;

【问题讨论】:

    标签: sql oracle dynamic input cursor


    【解决方案1】:

    试试这个:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      相关资源
      最近更新 更多