PL / SQL - 光标。无法遍历表(varchar参数)

时间:2015-10-30 11:51:06

标签: oracle stored-procedures syntax plsql compiler-errors

我创建了一个程序来计算记录的哈希码(表的完整行),然后使用计算的哈希码编号更新列。

此处列出了我的代码(基于我设法从Google收集的一些信息):

CREATE OR REPLACE PROCEDURE calcHashCode (inputTableString IN varchar2) IS
  c_data varchar2(3000);  --QUERY
  c_cursor sys_refcursor; --CURSOR
  c_record inputTableString%rowtype; -- Problem is here
BEGIN
  c_data := 'SELECT * FROM ' || inputTableString;

  OPEN c_cursor for c_data;

  LOOP
    FETCH c_cursor INTO c_record;
    EXIT WHEN c_cursor%notfound;

    -- will do stuff here with the records

    dbms_output.put_line('stuff');

  END LOOP;

  CLOSE c_cursor;
END;
/
SHOW ERRORS

 4/13  PLS-00310: with %ROWTYPE attribute, 'INPUTTABELA' must name a table, cursor or cursor-variable
 4/13  PL/SQL: Item ignored
11/25  PLS-00320: the declaration of the type of this expression is incomplete or malformed
11/5   PL/SQL: SQL Statement ignored

所以,我的想法(对于程序的最后阶段)是迭代记录,构建一个字符串,然后计算哈希码。之后,我将运行更新指令。

此时此事使用varchar作为参数,我无法遍历表格以获取连接记录。

3 个答案:

答案 0 :(得分:0)

动态游标是最丑陋的......

问题在于该部分:

  c_data varchar2(3000);  --QUERY
  c_cursor sys_refcursor; --CURSOR
  c_record inputTableString%rowtype;
我使用过这样的东西:

  TYPE t_data IS    REF CURSOR;
  cr_data           t_data;
  cr_data_rec       inputTableString%ROWTYPE;   --that table need to be exists in compile time

其余的都很好我认为

答案 1 :(得分:0)

您是否考虑过将整个声明推送到一个匿名块,然后由EXECUTE IMMEDIATE执行?然后,您可以将循环结构简化为简单的FOR循环。

此刻我离开了我的数据库,所以请原谅任何语法故障,但是像

这样的话
CREATE OR REPLACE PROCEDURE calcHashCode (inputTableString IN varchar2) IS
  c_data varchar2(30000);  --QUERY
BEGIN
  c_data := '
        BEGIN
            FOR aRec IN
                 (SELECT * FROM ' || inputTableString ||' )
            LOOP
                --do your stuff
             END LOOP;
        END';
  execute immediate c_Data;
END;
/

它可能不漂亮,而且你的" Stuff"可能不容易适应这个结构,但它是可行的

答案 2 :(得分:-1)

你可以使用PL / SQL包DBMS_SQL做所有这些事情,但是它绝对不适合初学者,你应该从更简单的开始。

Examples for DBMS_SQL