将plsql代码转换为函数

时间:2018-03-20 06:58:49

标签: oracle

我有这段代码要转换为函数,并通过从vendor_site_id传递ap_supplier_sites_all来调用select语句中的函数。这样我就可以得到vendor_number的值,即ap_suppliers的段1。在这段代码中,我有一个登录,从DFF表gecm_dff_ext的列属性52中获取前6位数字。

DECLARE
      v_ret_val     VARCHAR2(30);
      v_sup_gsl     VARCHAR2(30);
      v_vendor_id   NUMBER;
    BEGIN
        v_vendor_id := '${PO.H_VENDOR_ID}';--> vendor_id column from ap_suppliers
        IF <condition> = 'Y'
        THEN
            BEGIN
                SELECT SUBSTR(ATTRIBUTE52,1,6)
                INTO v_sup_gsl
                FROM gecm_dff_ext 
                WHERE primary_table ='AP_SUPPLIER_SITES_ALL'
                AND   primary_key = '${PO.H_VENDOR_SITE_ID}';--> This value should be vendor_site_id from ap_supplier_sites_all table 
                EXCEPTION
                    WHEN OTHERS THEN
                    v_sup_gsl := NULL;
            END;
            BEGIN
                IF v_sup_gsl IS NOT NULL THEN
                    SELECT segment1
                    INTO v_ret_val
                    FROM ap_suppliers
                    WHERE segment1 = v_sup_gsl; 
                END IF;
                EXCEPTION
                WHEN OTHERS THEN
                    v_ret_val := '';
            END;
        END IF;
      IF v_sup_gsl  IS NULL THEN
        BEGIN
            SELECT SEGMENT1
            INTO v_ret_val
            FROM ap_suppliers
            WHERE vendor_id=v_vendor_id;
            EXCEPTION
            WHEN OTHERS THEN
            v_ret_val := '';
        END;
    END IF; 
    :return_value:=v_ret_val;
    END; 

1 个答案:

答案 0 :(得分:0)

这是一个简化示例:以下SELECT返回某个部门编号的部门名称:

SQL> select dname
  2    from dept
  3    where deptno = &par_deptno;
Enter value for par_deptno: 10

DNAME
--------------
ACCOUNTING

SQL>

那么,如何将其转换为函数?通过使用正确的语法,声明一个返回变量,获取它并返回结果:

SQL> create or replace function f_test (par_deptno in dept.deptno%type)
  2    return dept.dname%type
  3  is
  4    retval dept.dname%type;
  5  begin
  6    select dname
  7      into retval
  8      from dept
  9      where deptno = par_deptno;
 10
 11    return retval;
 12  exception
 13    when no_data_found then
 14      return null;
 15  end;
 16  /

Function created.

SQL> select f_test(10) from dual;

F_TEST(10)
---------------------------------------------------------------------------
ACCOUNTING

SQL> select f_test(999) from dual;

F_TEST(999)
---------------------------------------------------------------------------


SQL>

这是你应该做的。您似乎正在返回v_ret_val,因此 - 您的代码可能如下所示:

create or replace function f_test (par_vendor_id po.h_vendor_id%type)
  return ap_suppliers.segment1%type
is
  v_ret_val ap_suppliers.segment1%type;
begin
  if <condition> = 'Y' then 
     ...
  end if;

  return v_ret_val;
end;