【发布时间】:2020-10-10 16:43:49
【问题描述】:
我正在尝试在 Oracle 中创建一个 pl/SQL 函数,该函数返回受给定约束影响的列的列名。例如,给定下表:
CREATE TABLE Products
( Mfr CHAR(3) NOT NULL
,Product CHAR(5) NOT NULL
,Description VARCHAR2(100) DEFAULT 'N/A'
,Price NUMBER(5,2)
,QtyOnHand NUMBER(5) DEFAULT 0
,CONSTRAINT ProductsPK
PRIMARY KEY(Mfr, Product)
,CONSTRAINT UniqueDescription
UNIQUE (Description)
,CONSTRAINT UniqueProduct
UNIQUE (Product)
,CONSTRAINT CheckPrice
CHECK (Price BETWEEN .01 AND 87.98)
,CONSTRAINT CheckQuantity
CHECK (QtyOnHand >= 0)
);
我想将 2 个值传递给一个函数,例如表名称(在本例中为“产品”)和约束名称(在本例中为 ProductsPK 注意:该函数应该能够处理任何给定约束)。鉴于这些详细信息,它应该返回受影响的列名。
截至目前,我的功能如下
SET SERVEROUTPUT ON;
CREATE OR REPLACE FUNCTION GET_CONSTRAINT_COLUMNS(
iTableName IN Varchar2,
iConstraintName IN Varchar2
)
RETURN varchar2
AS
CURSOR Extract_KEY IS
SELECT INDEX_NAME,a.constraint_type
FROM USER_CONSTRAINTS a
WHERE TABLE_NAME = iTableName;
--ORDER BY Column_ID;
CurrentRow Extract_KEY%ROWTYPE;
--Declaring Variables
wKeys VARCHAR2(50);
BEGIN
For CurrentRow IN Extract_Key LOOP
IF currentRow.Constraint_type = 'P' THEN
SELECT COLUMN_NAME
INTO wkeys
FROM user_cons_columns
WHERE TABLE_NAME = iTableName
AND constraint_name = iconstraintname;
ELSIF currentRow.Constraint_Type = 'U' THEN
SELECT COLUMN_NAME
INTO wkeys
FROM user_cons_columns
WHERE constraint_name = iconstraintname
AND table_name = iTableName;
END IF;
END LOOP;
RETURN wKeys;
END;
/
上述函数中的选择语句单独工作正常。但是当函数本身通过下面的匿名块执行时:
SET SERVEROUTPUT ON;
DECLARE
wconsumable varchar2(24);
BEGIN
wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
DBMS_OUTPUT.PUT_LINE(wConsumable);
END;
/
我收到以下错误:
Error starting at line : 47 in command -
DECLARE
wconsumable varchar2(24);
BEGIN
wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
DBMS_OUTPUT.PUT_LINE(wConsumable);
END;
Error report -
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "T325.GET_CONSTRAINT_COLUMNS", line 21
ORA-06512: at line 4
01422. 00000 - "exact fetch returns more than requested number of rows"
*Cause: The number specified in exact fetch is less than the rows returned.
*Action: Rewrite the query or change number of rows requested
其他信息:
上述函数中的主键选择语句(begin 之后的第一个)返回以下 IF RAN INDIVIDUALLY
MFR
PRODUCT
如果像这样单独运行,第二个选择语句(关于唯一键):
SELECT COLUMN_NAME FROM user_cons_columns WHERE constraint_name = 'UNIQUEPRODUCT' AND table_name = 'PRODUCTS';
返回这个:
Product
如您所见,某些约束可能会返回 1 或 2 列。不管有多少列,我都希望它们都存储在变量中并返回到调用函数的过程。
我怀疑我的问题源于我正在使用的光标,但我不能确定。我应该如何解决这个问题?
【问题讨论】:
标签: oracle plsql stored-functions