在一行上返回函数中的多个主键列。 PLSQL、SQL ORACLE 开发
Posted
技术标签:
【中文标题】在一行上返回函数中的多个主键列。 PLSQL、SQL ORACLE 开发【英文标题】:RETURNING multiple Primary Key Columns in a Function on one line. PLSQL, SQL ORACLE DEV 【发布时间】:2021-10-11 02:12:55 【问题描述】:我只是想知道如何从一个 DBMS 输出行中的表中返回多个主键列....
在表格中我有以下...
The code for my function is:
CREATE OR REPLACE FUNCTION Get_Constraint_Columns(
/*
* Oct 10th, 2021
* Return the column names that make up a PK constraint and columns that make up unique constraint.
*/
iTable VARCHAR2, iConstraint VARCHAR2
)
RETURN VARCHAR2
AS
wReturn VARCHAR2(30);
CURSOR ColumnSelected IS
SELECT Column_Name
FROM User_Cons_Columns
WHERE Table_Name = iTable AND Constraint_Name = iConstraint
ORDER BY Position;
CurrentRow User_Cons_Columns%ROWTYPE;
BEGIN
FOR CurrentRow IN ColumnSelected LOOP
wReturn := (CurrentRow.Column_Name);
RETURN wReturn;
END LOOP;
END;
/
当调用该函数并且报告是 SPOOLED 时,我得到:
当我需要它的样子时:
它有两个列名......(MFR,PRODUCT)我在代码中移动了一些东西并尝试了不同的东西,但它要么以相同的结果或错误结束。如果有人能指出我正确的方向,我将永远感激不尽。提前致谢!
【问题讨论】:
嘿,您是否尝试过使用正则表达式来获取列名,然后将它们组合为返回的字符串? 请use text, not images/links, for text--including tables & ERDs。转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。在图片中包含图例/键和说明。 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于 SQL 包括 DDL 和表格初始化代码。当你得到一个你不期望的结果时,暂停你的总体目标,切到第一个具有意外结果的子表达式并说出你的期望和原因,并通过文档证明是合理的。 How to AskHelp center 【参考方案1】:它失败的原因是RETURN
语句立即退出了块。所以你只会得到循环的第一次迭代。将RETURN
移出循环,AND 连接值以获得您想要的:
create or replace FUNCTION get_constraint_columns(
/*
* Oct 10th, 2021
* Return the column names that make up a PK constraint and columns that make up unique constraint.
*/
itable VARCHAR2, iconstraint VARCHAR2
)
RETURN VARCHAR2
AS
wreturn VARCHAR2(30);
CURSOR columnselected IS
SELECT column_name
FROM user_cons_columns
WHERE table_name = itable AND constraint_name = iconstraint
ORDER BY position;
currentrow user_cons_columns%ROWTYPE;
BEGIN
FOR CurrentRow IN columnselected LOOP
wreturn := wreturn ||', '||(currentrow.column_name);
END LOOP;
-- LTRIM removes the leading comma and space
RETURN LTRIM(wreturn,', ');
END;
使用LISTAGG
这个函数可以简化。
create or replace FUNCTION get_constraint_columns(
itable VARCHAR2, iconstraint VARCHAR2
)
RETURN VARCHAR2
AS
wreturn VARCHAR2(4000); --4000 because 30 can be too small
BEGIN
SELECT LISTAGG(column_name, ', ')
WITHIN GROUP (ORDER BY position)
INTO wreturn
FROM user_cons_columns
WHERE table_name = itable AND constraint_name = iconstraint
ORDER BY position;
RETURN wreturn;
END;
【讨论】:
以上是关于在一行上返回函数中的多个主键列。 PLSQL、SQL ORACLE 开发的主要内容,如果未能解决你的问题,请参考以下文章