oracle - 变量定义为引用表的列类型,但未在 oracle pl sql 中计算或初始化
问题描述
我在旧代码中有一个变量“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 但想在我在最终程序中替换它之前确认
提前感谢您的帮助!
解决方案
声明但未初始化的变量将具有 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。
推荐阅读
- c# - 列表/数组差异算法
- api - 资产 6.4 HTTP API - 上传资产
- swift - 快速发送消息后关闭 MessageComposeViewController
- python - 使用 Flask 进行 API 设计,结合 SQL Alchemy 和 Marshmallow
- postgresql - 如何使用 PSQL 客户端运行多个命令
- javascript - JavaScript 分页中的测验
- javascript - 此查询静默失败,我不明白为什么 - Firebase
- django - 操作错误:没有这样的列:users_userscore.id
- css - flex容器的CSS设置高度
- azure-devops - Azure 管道自托管代理,如何查看连接的 USB 设备?