变量定义为引用表的列类型,但未在oracle pl sql中计算或初始化

时间:2019-06-25 16:44:50

标签: oracle plsql

我在旧代码中有一个变量'v_bas_unused_commt',我正尝试将其重写,如下所示,在旧过程的BEGIN语句之前。

CREATE OR REPLACE PROCEDURE USB."BAS2_WIRES_SEG" (v_run_date number default 0)
 IS
v_bas_unused_commt  WIRES_DATA.bas_unused_commt%TYPE;

--WIRES_DATA is table getting updated by this proc

问题是:它在proc内没有执行任何操作,其变量为:'v_bas_unused_commt'(即,除了作为输入传递外,此变量根本没有使用),然后将其作为参数传递给函数计算以下字段:

v_bas_eb_expected_loss := bas2_el_calc (rec.CUR_BOOK_BAL,v_BAS_UNUSED_COMMT,v_BAS_PD,v_BAS_LGD,V_BAS_EAD);

--look at input 2.

我想确认何时重新编写此代码,是否应使用0代替v_BAS_UNUSED_COMMT或其他?我尝试使用表WIRES_DATA中的原始列名称BAS_UNUSED_COMMT代替v_BAS_UNUSED_COMMT,但是该列具有值,并且在计算后会导致v_bas_eb_expected_loss的值不同。但是,当我写

v_bas_unused_commt  WIRES_DATA.bas_unused_commt%TYPE;
and passed v_bas_unused_commt as input, same as old code, differences disappeared.

我认为可能是因为v_bas_unused_commt始终为0,但想在最终过程中将其替换之前先进行确认

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

已声明但未初始化的变量将具有NULL值(与零不同),除非在过程中的某个地方为其分配了其他值。使用这样的简单测试,您可以在进行函数调用之前对其进行验证:

FSITJA@db01 2019-06-25 12:01:23> create table t1(col1 varchar2(8));

Table created.

FSITJA@db01 2019-06-25 12:01:23> create or replace procedure fsitja.pr_test is
  2  v_empty t1.col1%type;
  3  begin
  4    if v_empty is null then
  5      dbms_output.put_line('I AM NULL');
  6    end if;
  7  end;
  8  /

Procedure created.

FSITJA@db01 2019-06-25 12:01:23> begin fsitja.pr_test; end;
  2  /
I AM NULL

PL/SQL procedure successfully completed.

您可能应该使用NULL。但是,请务必在进行更改之前检查它是否确实传递了NULL。