【发布时间】:2013-08-02 18:22:22
【问题描述】:
您好,我有几个表ITEMS_*,它们可能有不同的列,但存在某些列并且它们的类型都相同。一个例子:
CREATE TABLE "APT"."ITEMS_AV" (
-- These columns are common for all tables
"ID" NUMBER NOT NULL ENABLE,
"CODE" VARCHAR2(20) NOT NULL ENABLE,
"DESCRIPTION" VARCHAR2(50) NOT NULL ENABLE,
-- Other columns may differ
...,
-- The primary key is the same in all tables
CONSTRAINT "ITEMS_AV_PK" PRIMARY KEY ("ID")
) TABLESPACE "APT" ;
对于每个表,我编写了一个特殊的 PL/SQL 过程来处理表中的数据。每个过程中都声明了一个游标'cur':
CREATE OR REPLACE
PROCEDURE PROCESS_ITEMS_AV AS
CURSOR cur IS
SELECT ID, CODE, DESCRIPTION, ...
FROM ITEMS_AV;
BEGIN
FOREACH d IN cur LOOP
FIX_DATA(d);
-- Continue processing 'row' data
...
END LOOP
END PROCESS_ITEMS_AV;
在这个过程中,我需要调用过程 FIX_DATA 来修复当前行中的数据。例如从 row.CODE 中删除空格并从 row.DESCRIPTION 中删除无效字符。通常我会为每个单独的表声明这个过程:
CREATE OR REPLACE
PROCEDURE FIX_DATA (r IN OUT ITEMS_AV%ROWTYPE) AS
BEGIN
r.CODE := ...;
r.DESCRIPTION := ...;
END TESTPROC;
但是此过程对所有表都执行相同的操作,因此我希望只有一个过程 FIX_DATA 将在所有 PROCESS_ITEMS_* 过程中使用。问题是参数'r'声明中的表名:
PROCEDURE FIX_DATA (r IN OUT ITEMS_AV%ROWTYPE) AS ...
有没有办法声明 'r' 参数,以便我可以将它用于许多只有一些(但总是相同)列相同的游标?
提前非常感谢。 沃杰科技
【问题讨论】:
-
我建议不要一次发送一行,而是将一列传递给您的修复数据。这需要在 Process_items_av 过程中再进行一次迭代
-
我考虑过这样做,但如果我以后需要修复更多列,我必须更改 FIX_DATA 过程和所有 PROCESS_ITEMS_* 过程。因此,我宁愿传递一行,因为它只需要更改 FIX_DATA proc。