oracle function的sql调用(转)

本文介绍了在SQL中创建及调用不同类型的函数的方法,包括无参函数、带IN参数的函数、带OUT参数的函数及带INOUT参数的函数,并提供了具体的实现案例。

转自:http://www.blogjava.net/stevenjohn/archive/2012/08/12/385324.html

函数调用限制
1、SQL语句中只能调用存储函数(服务器端),而不能调用客户端的函数
2、SQL只能调用带有输入参数,不能带有输出,输入输出函数
3、SQL不能使用PL/SQL的特有数据类型(boolean,table,record等)
4、SQL语句中调用的函数不能包含INSERT,UPDATE和DELETE语句

1.function函数的语法如下:

      create or replace function function_name (

       argu1 [mode1] datatype1, --定义参数变量

       argu2 [mode2] datatype2 --定义参数变量

   ) return datatype --定义返回的数据类型

  is 

  begin

  end;

执行 var v1 varchar2(100) 
      exec :v1:=function_name

2.不带任何参数的定义

create or replace function get_user 

return varchar2 

is 

Result varchar2(50); --定义变量

begin 

select username into Result from user_users; 

return(Result); --返回值

end get_user;

3.带有in参数的

create or replace function get_sal(

empname in varchar2

) return number 

is 

Result number; 

begin 

select sal into Result from emp where ename=empname; 

return(Result); 

end;

执行: SQL> var sal number 
SQL> exec :sal:=get_sal('scott');

4.带out参数的

create or replace function get_info(

e_name varchar2,

job out varchar2

) return number 

Is

Result number; 

begin 

select sal,job into Result,job from emp where ename=e_name; 
return(Result); 
end;

执行: SQL> var job varchar2(20) 
SQL> var dname varchar2(20) 
SQL> exec :dname:=get_info('SCOTT',:job)

5.带in out参数的

6.函数调用举例

create or replace function f_sys_getseqid(
    v_seqname           IN VARCHAR2,
    v_provincecode      IN VARCHAR2    --省编码
) return Varchar2
IS
    iv_date             VARCHAR2(8);
    iv_seqname          VARCHAR2(50);
    iv_sqlstr           VARCHAR2(200);
    iv_seq              VARCHAR2(8);
    iv_seqid            VARCHAR2(16);
BEGIN
    iv_seqname := LOWER(TRIM(v_seqname));
    iv_sqlstr := 'SELECT '||iv_seqname||'.nextval FROM DUAL';
    EXECUTE IMMEDIATE iv_sqlstr INTO iv_seq;--执行动态的sql语句,执行相似的一组语句
    IF v_seqname = 'SEQ_FUNCROLE_ID' THEN
      iv_seqid:= 'ESS' || LPAD(iv_seq,5,'0');
    ELSE
      SELECT substrb(v_provincecode,1,2)||TO_CHAR(SYSDATE,'yymmdd') INTO iv_date FROM DUAL;
      iv_seqid:= iv_date || LPAD(iv_seq,8,'0');
    END IF;
    RETURN iv_seqid;
EXCEPTION
    WHEN OTHERS THEN
    RETURN NULL;
END;

  调用方式如下:

    SELECT TO_NUMBER(F_SYS_GETSEQID('SEQ_TERMTRADE_ID', V_PROVINCE_CODE)) INTO V_BATCH_ID FROM DUAL;

   EXECUTE IMMEDIATE的说明:执行动态的sql语句。

### 调用Oracle存储过程处理数据集 在Oracle数据库环境中,调用存储过程来处理数据集是一项常见的操作。这可以通过PL/SQL匿名块实现,也可以通过应用程序接口完成。下面展示了一个基本的例子,说明如何创建并调用一个用于处理数据集的存储过程。 #### 创建存储过程 假设有一个需求是要更新特定条件下的记录集合,在这种情况下可以定义如下所示的一个简单存储过程: ```sql CREATE OR REPLACE PROCEDURE update_dataset ( p_condition IN VARCHAR2, p_new_value IN NUMBER ) AS BEGIN UPDATE employees SET salary = p_new_value WHERE department_id LIKE p_condition; END; / ``` 此存储过程中有两个输入参数:`p_condition` 和 `p_new_value`,分别代表查询条件以及要设置的新工资数值[^1]。 #### 使用函数返回结果集 如果希望从存储过程中获取某些计算后的值作为输出,则可以在存储过程中声明OUT类型的参数或将结果放入游标变量中传递给外部程序。这里给出利用游标的例子: ```sql CREATE OR REPLACE PROCEDURE get_employees_by_dept( deptno IN departments.department_id%TYPE, emp_cursor OUT SYS_REFCURSOR ) IS BEGIN OPEN emp_cursor FOR SELECT first_name, last_name, email FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE d.department_id = deptno; END; / ``` 上述代码片段展示了如何基于部门编号检索员工列表,并将这些信息封装在一个游标内供后续使用。 #### 执行存储过程 当已经准备好相应的存储过程之后,就可以按照以下方式执行它们了: - **通过命令行工具** 对于简单的测试目的来说,可以直接在SQL*Plus或其他类似的客户端工具里运行如下语句: ```sql DECLARE v_cur SYS_REFCURSOR; BEGIN get_employees_by_dept(10, v_cur); LOOP FETCH v_cur INTO some_record_type; -- 假设some_record_type已正确定义 EXIT WHEN v_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE(some_record_type.first_name || ' ' || some_record_type.last_name); END LOOP; CLOSE v_cur; END; / ``` 这段脚本首先打开游标,接着逐条读取其中的数据直到结束为止;每取出一条记录就打印出来显示其姓名字段的内容。 - **编程语言集成** 更常见的是与其他高级语言相结合来进行复杂业务逻辑的操作。比如Python中的cx_Oracle库允许开发者轻松地连接到Oracle服务器并且调用存储过程: ```python import cx_Oracle connection = cx_Oracle.connect('username/password@localhost/orcl') cursor = connection.cursor() result_var = cursor.var(cx_Oracle.CURSOR) try: cursor.callproc('get_employees_by_dept', [10, result_var]) rows = result_var.getvalue() finally: cursor.close() connection.close() for row in rows: print(row) ``` 以上示例演示了怎样借助第三方模块与远程数据库交互从而达到同样的效果——即调用了名为`get_employees_by_dept` 的存储过程并将得到的结果呈现了出来。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值