我创建了一个程序来计算记录的哈希码(表的完整行),然后使用计算的哈希码编号更新列。
此处列出了我的代码(基于我设法从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
作为参数,我无法遍历表格以获取连接记录。
答案 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
做所有这些事情,但是它绝对不适合初学者,你应该从更简单的开始。