pl/sql 中function的语法 和调用。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pl/sql 中function的语法 和调用。相关的知识,希望对你有一定的参考价值。
为什么运行时老是报错,提示无效,请问如何改正:
create or replace function uaes(insid IN VARCHAR2) return varchar2 is
Result VARCHAR2(4000);
begin
select a.tablename from bas_role_table a where a.tablename=insid
return(Result);
end;
只要问题解决,可以追加分数!
tablename 是 bas_role_table 表中的字段。
主要是对function的调用方法!
Result VARCHAR2(4000);
begin
--通过游标,CIP联络员的动态值
FOR CUR IN
(
select table_id from bas_role_table_type a where a.table_id=insid
)
LOOP
Result := Result||CUR.table_id||',';
END LOOP;
--去掉最后一个逗号
Result:=SUBSTR(Result,0,LENGTH(Result)-1);
return(Result);
end;本回答被提问者采纳 参考技术B 1. result 没有赋值啊 ?
2. 如果是
select a.tablename into result from bas_role_table a where a.tablename=insid
万一没有符合条件的数据呢? 还是i会出异常
最好这样:
select count(a.tablename) into ncount from bas_role_table a where a.tablename=insid
if ncount = 1 then
select a.tablename into result from bas_role_table a where a.tablename=insid
else
result := ''; -- 如何处理
end if;
3. 调用的地方看看你的语法
4. a.tablename=insid ,这个条件对吗? 参考技术C create or replace function uaes(insid IN VARCHAR2) return varchar2 is
tab_name VARCHAR2(4000);
begin
select a.tablename into tab_name from bas_role_table a where a.tablename=insid
return tab_name;
end; 参考技术D select Result =a.tablename from bas_role_table a where a.tablename=insid
查询必须只返回一条结果。。。
FUNCTION 调用问题中的 PL/SQL 集合
【中文标题】FUNCTION 调用问题中的 PL/SQL 集合【英文标题】:PL/SQL collection in FUNCTION call issue 【发布时间】:2018-07-11 11:07:13 【问题描述】:我有一个函数 MY_FUNC,它将 PL/SQL 集合作为参数。
但是,当我尝试编译具有在 INSERT 语句中调用 MY_FUNC 的过程 (MY_PROCEDURE) 的包时出现错误。这是过程和对函数的调用
MY_PROCEDURE (var1 IN OUT VARCHAR2, in_table_list IN OUT bf_types.table_of_addresses_type)
IS
BEGIN
INSERT INTO my_tab
SELECT col_A,
col_B,
MY_FUNC(var1, in_table_list)
FROM json_table (json_str etc etc)
END my_procedure;
/
我收到以下错误:
541/3 PL/SQL:忽略 SQL 语句 561/3 PL/SQL:ORA-00904:“MY_FUNC”:无效 标识符
561/3 PLS-00306:调用中的参数数量或类型错误 'MY_FUNC'
561/42 PLS-00382:表达式类型错误
这是 MY_FUNC 的代码,编译良好:
CREATE OR REPLACE FUNCTION my_func (in_marketid IN VARCHAR2, in_list_of_addresses IN bf_types.table_of_addresses_type) RETURN DATE
IS
cnt INTEGER;
BEGIN
cnt := TO_NUMBER(SUBSTR(in_marketid,1,1));
RETURN(in_list_of_addresses(cnt).move_in_date);
END my_func;`
为了测试,我更改了 MY_FUNC 以删除 PL/SQL 集合参数并修改了我的调用。
即创建或替换函数 my_func (in_marketid IN VARCHAR2) 返回日期
代码编译,因此如果函数将 PL/SQL 表(集合)作为参数,则在 INSERT 语句中调用函数似乎存在问题。另外,请注意 MY_FUNC 已在包外声明。
如果有人能提供帮助,我将不胜感激。
【问题讨论】:
你可以在调用部分尝试使用 schema name.function_name 如果架构名称是 schema1 那么 schema1.MyFunc 或从插入语句中删除函数调用,并尝试在过程中正常调用该函数..并检查它是否正常工作。 【参考方案1】:但是,当我尝试编译具有 在 INSERT 语句中调用 MY_FUNC 的过程 (MY_PROCEDURE)。 这是过程和对函数的调用
我试图模拟你的情况并准备了一些你可以参考的东西。请阅读我的内联 cmets。
--Created Object
CREATE OR REPLACE TYPE table_of_addresses_type IS OBJECT
(
move_in_date date
);
--table of your object
create or replace Type v_table_of_addresses_type is table of table_of_addresses_type;
/
--Table for inserting the record
CREATE TABLE my_tab(col DATE);
/
--Function
CREATE OR REPLACE FUNCTION my_func(
in_marketid IN VARCHAR2,
in_list_of_addresses IN v_table_of_addresses_type)
RETURN DATE
IS
cnt INTEGER;
BEGIN
cnt := TO_NUMBER(SUBSTR(in_marketid,1,1));
RETURN(in_list_of_addresses(cnt).move_in_date);
END my_func;
/
--Procedure
CREATE OR REPLACE PROCEDURE MY_PROCEDURE(
var1 IN OUT VARCHAR2,
in_table_list IN OUT v_table_of_addresses_type)
IS
BEGIN
INSERT INTO my_tab
SELECT MY_FUNC(var1, in_table_list) FROM dual;
COMMIT;
END my_procedure;
/
--Calling / Exection:
DECLARE
x v_table_of_addresses_type :=v_table_of_addresses_type();
v_dt DATE;
var1 VARCHAR2(10);
BEGIN
x.EXTEND(3);
--Populating the collection manually. You can populate it via a query as well
x(1) := table_of_addresses_type(to_date('2017-05-21','YYYY-MM-DD'));
x(2) := table_of_addresses_type(to_date('2017-05-22','YYYY-MM-DD'));
x(3) := table_of_addresses_type(to_date('2017-05-23','YYYY-MM-DD'));
--testing function call
v_dt := MY_FUNC('111',x);
dbms_output.put_line (v_dt);
var1:= '111';
--Calling Procedure. have to pass the var1 since its decalre as INOUT paramater in your procedure.
MY_PROCEDURE(var1,x);
END;
/
--testing records from the table
Select * from my_tab
PS:您可以将过程和函数包装在我的回答中没有做的包中。
【讨论】:
以上是关于pl/sql 中function的语法 和调用。的主要内容,如果未能解决你的问题,请参考以下文章
在pL/sql中,我给表设置一个别名,在where条件后用别名.字段,这个字段不出来是啥原因
想问问大家,sql server,PL/SQL,mysql这几个啥区别?