【问题标题】:Create PLSQL function to return a table name创建 PLSQL 函数以返回表名
【发布时间】:2020-03-31 05:19:07
【问题描述】:

我正在尝试创建一个函数来返回一个表值以放入另一个查询中。

这是我要返回表名的函数

create or replace PROCEDURE GET_TBL_NM (LYTID INTEGER)
AS 


BEGIN
    DECLARE
    CREATE OR REPLACE TYPE names_nt IS TABLE OF VARCHAR2 ( 1000 ); 
    exec select vw into :names_nt from io_layout_views where layout_id = LYTID;
  RETURN (names_nt);
END GET_TBL_NM;

这是我想调用函数的地方:

select * from TABLE(my_function(args));

现在我在编译函数时遇到问题。

【问题讨论】:

  • return 程序中的语句? exec(一个 SQL*Plus 命令,PL/SQL 不理解)在 PL/SQL 过程中间?恐怕你跳过了第一周的 PL/SQL 课程。抱歉,如果不先学习基础知识,您将无法编写有效的函数。

标签: database oracle plsql


【解决方案1】:

您创建了一个带有许多语法错误的Procedure。如果您打算从中获取Return 值,则需要创建一个Function,如下所示。 试试这个:

类型和表格

CREATE OR REPLACE TYPE names_nt IS TABLE OF VARCHAR2 ( 1000 ); 
Create  table io_layout_views (vw varchar2(1000),layout_id number);
insert into io_layout_views values ('AA',1);
insert into io_layout_views values ('BB',1);

--功能

CREATE OR REPLACE FUNCTION get_tbl_nm (
    lytid INTEGER
) RETURN names_nt AS
    v_var   names_nt := names_nt ();
BEGIN
    SELECT vw BULK COLLECT INTO
        v_var
    FROM io_layout_views
    WHERE layout_id = lytid;

    return(v_var);
END get_tbl_nm;

执行:

select * from TABLE(get_tbl_nm(1));

您还必须注意,当您使用Table 函数时,如果集合相对较大,则可能会出现性能问题。由于集合很大,在填充完整集合之前不会显示结果,为避免这种情况,我们使用PIPELINED 函数,如下所示。此函数将在集合可用时立即返回结果。

流水线功能:阅读更多HERE

CREATE OR REPLACE FUNCTION get_tbl_nm (lytid INTEGER) 
    RETURN names_nt  PIPELINED
    AS
        v_var   names_nt := names_nt ();
    BEGIN
        FOR i IN (   
                   SELECT vw 
                    FROM io_layout_views 
                    WHERE layout_id = lytid
                   ) 
        LOOP
            PIPE ROW ( i.vw ); -- Building the resultset
        END LOOP;
    RETURN;
END get_tbl_nm;

【讨论】:

  • 好的,我创建了函数,但我在哪里声明这些变量?创建或替换类型 names_nt 是 VARCHAR2 表(1000);创建表io_layout_views(vw varchar2(1000),layout_id number);
  • 这些是数据库对象,必须在SQL的范围内创建。因此,只需打开一个 SQLDEVELOPERSQLPLUS 或任何用于连接到 Orcle 并执行这些语句的接口。
  • 当我从 GET_TBL_NM() 中选择 * 时,我得到 IO_LAYOUT_VIEWS 的表值而不是其持有的表的值
  • @C.Ward 你必须阅读我的完整答案。我已经展示了您必须如何选择记录。它就像select * from TABLE(get_tbl_nm(1));,因为你的函数需要一个输入参数,你必须在执行它时传递​​它
  • 所以当我这样设置时: select * from TABLE(get_tbl_nm(1)) 我得到的值是 'AA' 而不是存储在表 AA 中的数据
【解决方案2】:

您已经创建了procedure,它不能像您使用的那样直接用于在SELECT 查询中返回值。

您需要独立创建UDT,可以在function(PL/SQL)中使用,也可以直接在query(SQL)中使用。

CREATE OR REPLACE TYPE NAMES_NT IS
    TABLE OF VARCHAR2(1000);
/

你需要创建的函数必须返回新创建的类型如下:

CREATE OR REPLACE FUNCTION GET_TBL_NM (
    LYTID INTEGER
) RETURN NAMES_NT AS
    NAMES_NT_VALS   NAMES_NT; -- newly created UDT
BEGIN
    SELECT
        VW
    BULK COLLECT -- need to use BULK COLLECT
    INTO NAMES_NT_VALS
    FROM
        IO_LAYOUT_VIEWS
    WHERE
        LAYOUT_ID = LYTID;

    RETURN NAMES_NT_VALS;
END GET_TBL_NM;

【讨论】:

  • 当我从 GET_TBL_NM() 中选择 * 时,我得到 IO_LAYOUT_VIEWS 的表值而不是其持有的表的值
  • 显然!!!!如果要查找表的数据,则必须使用动态游标创建过程,根本不建议这样做。不同的表有不同数量和类型的列。它将解决什么目的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 2013-06-06
相关资源
最近更新 更多