Oracle PL/SQL-Cursor。Can';t遍历表(varchar参数)

Oracle PL/SQL-Cursor。Can';t遍历表(varchar参数),oracle,stored-procedures,syntax,plsql,compiler-errors,Oracle,Stored Procedures,Syntax,Plsql,Compiler Errors,我创建了一个过程来计算记录的hashcode(表的完整行),然后用计算出的hashcode编号更新列 以下是我的代码(基于我从谷歌收集的一些信息): 因此,我的想法(对于过程的最后阶段)是遍历记录,用构建字符串,然后计算哈希代码。之后,我将运行更新指令 在这一点上,使用varchar作为参数,我无法通过迭代表来获取连接记录。动态游标是最丑陋的 问题在于该部分: c_data varchar2(3000); --QUERY c_cursor sys_refcursor; --CURSOR

我创建了一个过程来计算记录的hashcode(表的完整行),然后用计算出的hashcode编号更新列

以下是我的代码(基于我从谷歌收集的一些信息):

因此,我的想法(对于过程的最后阶段)是遍历记录,用构建字符串,然后计算哈希代码。之后,我将运行更新指令


在这一点上,使用
varchar
作为参数,我无法通过迭代表来获取连接记录。

动态游标是最丑陋的

问题在于该部分:

  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

其余的都很好,我想你可以用PL/SQL包
DBMS\u SQL
来做这类事情,但是这绝对不是初学者的事,你应该从更简单的开始


您是否考虑过将整个声明和循环推送到一个匿名块中,然后由executeimmediate执行?然后可以将循环构造简化为简单的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;
/

它可能不漂亮,你的“东西”可能不容易适应这个结构,但它是可行的

如果你要“做东西”,那么你应该知道你要找的是什么列。如错误所述,
%ROWTYPE
需要一个表,而不是代表表名的字符串。我理解。这就是我想弄明白的。我将尝试查询所有的标签,看看我是否能用这种方式解决问题。从表中获取所有字段,然后以这种方式计算哈希代码。答案是:)谢谢。如果你正在学习SQL和游标,请从一个简单的例子开始。(这是一个工作项目:(…也许你应该问另一个问题并描述需要做什么。可能还有其他方法来完成你所需要的。这很酷,但很复杂。但是是的…它似乎做到了窍门:D thx作为提示!我必须尝试这个想法。我在插入之前创建触发器来解决问题,它不是动态的…但是t因为我不必在很多表中执行此操作…它完成了以下操作…:NEW.HASHCODE:=DBMS\u UTILITY.GET\u HASH\u VALUE(StringToCalculate,16,1024);有趣的部分仍然是计算StringToCalculate,这可能涉及扫描所有的_tab_列并构建SELECT来解析正确的列。但是如果动态执行,我必须问-当有人在以后将额外的列添加到表上时会发生什么?ALTER table不会触发触发器来重新计算ha如果这是您所期望的,则每行执行一次sh。拥有保留要散列的最终列列表的pre-table触发器可能是最容易维护的解决方案。
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;
/