在PL / SQL中的select语句中调用函数

时间:2016-12-16 19:27:43

标签: oracle plsql plsqldeveloper

我试图在select语句中调用函数。它没有工作,这是我寻求帮助的方式。

以下代码就像示例,将在包中运行:

功能:

Function sum_val(val1 in NUMBER, val2 in NUMBER) return float is

    u float;
BEGIN

    u := (val2+ val1) / 100;         

    return u;

END sum_val;

SELECT语句:

PROCEDURE xy_prc(pi_table_in   IN VARCHAR2) IS

BEGIN

sql_stmt := 'CREATE TABLE AS tbx
             SELECT 
            t.*, '|| sum_val(t.val1, t.val2) ||' AS Val3
            FROM '|| pi_table_in ||' t';

EXECUTE IMMEDIATE sql_stmt; 

END;

问题在于:

'|| sum_val(t.val1, t.val2) ||' AS Val3

在这种情况下,我必须声明t.val1,t.val2,并且不会替换SELECT语句中的值。

这也没有奏效:

'|| sum_val('t.val1', 't.val2') ||' AS Val3

在这种情况下,'t.val1', 't.val2'将为值(STRINGS)!

可以用SELECT语句调用这个函数吗?

非常感谢您的回答!

3 个答案:

答案 0 :(得分:2)

在我看来你太努力了:P

你不能只在动态查询执行时调用该函数吗?

PROCEDURE xy_prc(pi_table_in   IN VARCHAR2) IS

BEGIN

sql_stmt := 'CREATE TABLE  tbx AS
             SELECT t.*
                  , sum_val(t.val1, t.val2) AS Val3
            FROM '|| pi_table_in ||' t';

EXECUTE IMMEDIATE sql_stmt; 

END;

答案 1 :(得分:1)

代码的问题在于,如果要在SQL查询中使用它,则无法将函数SUM_VAL定义为包函数。 它必须在架构中创建。

create or replace Function sum_val(val1 in NUMBER, val2 in NUMBER) return float is

        u float;
    BEGIN

        u := (val2+ val1) / 100;         

        return u;

    END sum_val;

当然,您的程序可以打包。请参阅下面更正的语法

procedure xy_prc(pi_table_in in varchar2) is
sql_stmt varchar2(1000);
BEGIN

sql_stmt := ' create table tbx as  SELECT 
            t.*, sum_val(t.val1, t.val2) as  Val3
            FROM '|| pi_table_in ||' t';

EXECUTE IMMEDIATE sql_stmt; 

END;

答案 2 :(得分:0)

非常感谢您的回答!

解决方案应该非常容易。我可以从任何DDL脚本,函数或包调用函数COUNT()。我的功能" sum_val()"只能在我的包裹中调用。

正如Mina所说,该功能必须创建如下:

create or replace Function...

能够在SQL-statment中调用函数COUNT(),如Select count(*) from tb或SQL的任何其他函数。

问题是,因为(创建或替换函数)函数将在架构中可用,并且可以从任何包或DDL脚本调用。我想创建一个私有函数,只能从Package中调用。

我的解决方案是:必须将函数声明为包中的公共对象,如下所示:

CREATE PACKAGE test AS
   PROCEDURE xy_prc(pi_table_in in varchar2);
   Function sum_val(val1 in NUMBER, val2 in NUMBER) return float;
END test;
/


CREATE OR REPLACE PACKAGE BODY test AS

    Function sum_val(val1 in NUMBER, val2 in NUMBER) return float is

        u float;
    BEGIN

        u := (val2+ val1) / 100;         

        return u;

    END sum_val;

   procedure xy_prc(pi_table_in in varchar2) is
      sql_stmt varchar2(1000);
   BEGIN

      sql_stmt := ' create table tbx as  SELECT 
               t.*, test.sum_val(t.val1, t.val2) as  Val3
               FROM '|| pi_table_in ||' t';

      EXECUTE IMMEDIATE sql_stmt; 

   END xy_prc;

END test;
/

通过这种方式,我可以在包中的任何SQL-Statment中调用函数test.sum_val(t.val1, t.val2)