在一行上返回函数中的多个主键列。 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 开发的主要内容,如果未能解决你的问题,请参考以下文章

映射到多个主键的外键列

jqgrid 主键列的设定

如何在辅助表中的非主键列上连接表?

在查询中的复合外键/主键列上连接表

建表的约束

oracle:物化视图中的主键列