VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

函数与存储过程传入参数与查询字段同名

功能描述

允许存储过程和函数传入参数和逻辑代码中查询的字段重名。

注意事项

  • 在查询的select部分,如果遇到表字段和传入的参数同名的情况,仍然按照表字段进行查询。

  • 在查询的select部分,如果遇到表字段不和传入的参数同名,则查询出传入参数值。

  • 该功能仅在数据库兼容模式为Oracle时能够使用(即创建DB时DBCOMPATIBILITY='A'),在其他数据库兼容模式下不能使用该特性。

语法格式

  • 函数创建

    create or replace function 函数名(参数1 模式 数据类型,......)return 数据类型
    
  • 存储过程创建

    create or replace function 过程名(参数1 模式 数据类型,......)
    

示例

1、创建并切换至兼容Oracle的库db_oracle。

CREATE DATABASE db_oracle dbcompatibility='A';
\c db_oracle

2、开启dbms_output功能。

set serveroutput on;

3、新建测试用表并插入数据(表t1与函数有重名字段id,表t2与函数没有重名字段)。

create table t1(id number, name varchar2(200));
Insert into t1 values(1,'a1');
create table t2(val number, name varchar2(200));
Insert into t2 values(1,'a1');

4、创建函数。

create or replace function func(id number) return number
as
type num_list is table of number index by binary_integer;
type var_list is table of varchar2(100) index by binary_integer;
v_id1 num_list ;
v_id2 num_list ;
v_col1 var_list ;
v_col2 var_list ;
begin
select id,name bulk collect into v_id1, v_col1 from t1 where id = 1;
select id,name bulk collect into v_id2, v_col2 from t2 where id = 2;
dbms_output.put_line('id: ' || id);
dbms_output.put_line('v_id1: ' || v_id1(1));
dbms_output.put_line('v_col1: ' || v_col1(1));
dbms_output.put_line('v_id2: ' || v_id2(1));
dbms_output.put_line('v_col2: ' || v_col2(1));
return 0;
end;
/

5、调用函数输入参数为1。

select func(1) from dual;

返回结果为:

id: 1
v_id1: 1
v_col1: a1
v_id2:
v_col2:
 func
------
    0
(1 row)

6、调用函数输入参数为2。

select func(2) from dual;

返回结果为:

id: 2
v_id1: 1
v_col1: a1
v_id2: 2
v_col2: a1
 func
------
    0
(1 row)