Oracle PL/SQL-Cursor。Can';t遍历表(varchar参数)
我创建了一个过程来计算记录的hashcode(表的完整行),然后用计算出的hashcode编号更新列 以下是我的代码(基于我从谷歌收集的一些信息): 因此,我的想法(对于过程的最后阶段)是遍历记录,用构建字符串,然后计算哈希代码。之后,我将运行更新指令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
在这一点上,使用
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;
/