zoukankan      html  css  js  c++  java
  • 【oracle】procedure, function,绑定变量

    1124-01 procedure, function,绑定变量

    补充:子程序中的 查询语句,dml,ddl,tcl语句
    1.查询语句
    1)静态语句:select into from;

    2)动态语句:execute immediate <vv_sql> into <vv_result>;

    2.DML,TCL

    1)静态SQL
    2)动态SQL:execute immediate <vv_sql>;
    3. DDL
    1) 动态SQL
    注意:如果 数据库对象的名称,字段名称 是用字符串变量或字符串拼接 得到的,那么只能用 动态SQL,否则不会被解析为 数据库对象,而作为普通字符串。
    ——procedure
    语法:
    create or replace procedure <procedure> (
    参数1 in 数据类型,
    参数2 out 数据类型,

    )
    is
    变量|数据类型的定义
    begin
    <body>
    exception
    <exception_handler>
    end <procedure>;
    /

    说明:参数的数据类型, 不可指定数据类型的长度。

    调用方式:
    1. 普通变量
    <procedure>(<参数列表>);
    2.绑定变量
    execute <procedure>(<参数列表>);
    或者
    call <procedure>(<参数列表>);

    【例子】
    set serveroutput on;
    /*定义存储过程*/
    create or replace procedure prc_getCnt(
    ii_serial_no in integer,
    oi_result out integer
    )
    is
    begin
    select count(*) into oi_result from t_sales where serial_no >= ii_serial_no;
    exception
    when others then
    oi_result := sqlcode;
    end prc_getCnt;
    /

    /*调用*/
    set serveroutput on;
    --参数为 1.普通变量
    declare
    vi_serial_no integer;
    vi_result integer;
    begin
    vi_serial_no := 2;
    prc_getCnt( vi_serial_no, vi_result );
    dbms_output.put_line(vi_result);
    end;
    /


    set serveroutput on;
    --参数为 2.绑定变量
    variable vi_serial_no number; --定义
    variable vi_result number;
    execute :vi_serial_no := 2; --赋值
    print vi_serial_no;
    print vi_result;
    execute prc_getCnt(:vi_serial_no,:vi_result); --引用
    --call prc_getCnt(:vi_serial_no,:vi_result); --此处call 等同于 execute
    print vi_result;


    说明:oracle的普通变量,参数最终都被解析为绑定变量的。
    动态绑定变量的使用场景:
    1. 调用procedure,function
    2. ref cursor游标的定义

    绑定变量 参考:
    使用绑定变量的一点总结!
    http://wenku.baidu.com/view/9cd65005284ac850ad0242b0.html?from=search

    Oracle数据库的绑定变量特性及应用 http://wenku.baidu.com/view/92be30c24028915f804dc280.html?from=search


    ——function
    语法:
    create or replace function <function> (
    参数1 in 数据类型,
    参数2 out 数据类型,

    )
    return 数据类型
    is
    变量|数据类型的定义
    begin
    <body>
    exception
    <exception_handler>
    end <procedure>;
    /

    说明:参数|return的数据类型, 不可指定数据类型的长度。


    1. ORA-14552:cannot perform a DDL,commit or rollback inside a query or DML.
    即当function中执行DDL,commit,rollback语句时,不可以用a query ,DML 调用该function。

    /*举例:删除指定数据库对象*/
    create or replace function fnc_drop_object(
    iv_obj_name in varchar2(30)
    )
    return integer
    is
    oi_result integer;
    vv_obj_type varchar2(30);
    vv_sql varchar2(500);
    begin
    /**@description 删除类型为 TABLE,SEQUENCE,VIEW,SYNONYM 的数据库对象*/
    select object_type into vv_obj_type from user_objects where object_name = upper('iv_obj_name');
    if (vv_obj_type is not null) and (instr('TABLE$SEQUENCE$VIEW$SYNONYM',vv_obj_type) > 0) then
    vv_drop_sql := 'drop '||vv_obj_type||' '||iv_obj_name;
    execute immediate vv_sql;
    oi_result := 0;
    end if;
    return oi_result;
    exception
    when others then
    oi_result := sqlcode;
    return oi_result;
    end;
    /

    调用方式1.a query :报错 ORA-14552
    set serveroutput on;
    select fnc_drop_object('seq_test01') from dual;

    调用方式2.定义变量接收return:正确
    set serveroutput on;
    declare
    vi_result integer;
    begin
    vi_result := fnc_drop_object('seq_test01');
    dbms_output.put_line(vi_result);
    end;
    /

    调用方式2.定义绑定变量接收return:正确
    set serveroutput on;
    var vi_result number; --没有integer 类型
    -- variable vi_result number;
    print vi_result; --默认值为null
    exec :vi_result := fnc_drop_object('seq_test01');
    -- execute :vi_result := fnc_drop_object('seq_test01');
    print vi_result;


    调用方式3.dbms_output打印:正确
    set serveroutput on;
    begin
    dbms_output.put_line(to_char( fnc_drop_object('seq_test01')));
    end;
    /

    调用方式4.:同3,正确
    set serveroutput on;
    execute dbms_output.put_line(to_char( fnc_drop_object('seq_test01'))); --execute 相当于 在plsql 块前后分别 加上 begin 和 end;

    /*例子:周函数*/
    create or replace function fnc_get_weekend(statis_date in number(8))
    return integer;
    is
    oi_result integer;
    begin
    select to_number(to_char(next_day(to_date(to_char(statis_date),'yyyymmdd'),'sunday') -7 ,'yyyymmdd'))
    into oi_result from dual;
    return oi_result;
    exception
    when others then
    oi_result := sqlcode;
    return oi_result;
    end;
    /

  • 相关阅读:
    SAP S/4HANA extensibility扩展原理介绍
    SAP CRM系统订单模型的设计与实现
    使用nodejs代码在SAP C4C里创建Individual customer
    SAP Cloud for Customer Account和individual customer的区别
    Let the Balloon Rise map一个数组
    How Many Tables 简单并查集
    Heap Operations 优先队列
    Arpa’s obvious problem and Mehrdad’s terrible solution 思维
    Passing the Message 单调栈两次
    The Suspects 并查集
  • 原文地址:https://www.cnblogs.com/greenZ/p/8721887.html
Copyright © 2011-2022 走看看