我试图在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语句调用这个函数吗?
非常感谢您的回答!
答案 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)
。