如何在pl/sql中判断一个记录变量为空
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在pl/sql中判断一个记录变量为空相关的知识,希望对你有一定的参考价值。
比如我定义了一个函数get_dept_records如下:
CREATE OR REPLACE FUNCTION get_dept_records(t_id NUMBER) RETURN dept%ROWTYPE;
在主程序中调用如下:
DECLARE
dept_record dept%ROWTYPE;
BEGIN
dept_record := get_records(1);
IF student_record ********* THEN
dbms_output.put_line('记录为空');
ELSE
dbms_output.put_line('部门名字:'||dept_record.dept_name);
END IF;
END;
如果在get_dept_records(1)找到了记录直接返回记录,如果没有找到记录则捕捉异常然后return null,
那么在主程序的*********这里我应该怎么判断当前的dept_record变量是否是空的呢?
不要说让我判断dept_record.dept_name is null啊,因为字段值本身是有可能为空的.
使用下no_data_found看看!
exceptionwhen no_data_found then
dbms_output.put_line('数据输入有误!');追问
我是在函数里面捕获的no_data_found,如果是no_data_found异常就return null,也就是说在函数里面即使发生了异常在主程序里也是看不到的,然后我想在主程序里面判断当前的dept_record里面是否有值.
参考技术A 设置一个出参 ,return 出参当标记在 PL/SQL 中使用记录表
【中文标题】在 PL/SQL 中使用记录表【英文标题】:Using Tables of Records in PL/SQL 【发布时间】:2009-10-22 12:18:27 【问题描述】:我在我的 PL/SQL 包中声明了以下类型:
TYPE t_simple_object IS RECORD (
wert NUMBER,
gs NUMBER,
vl NUMBER);
TYPE t_obj_table IS TABLE OF t_simple_object
INDEX BY BINARY_INTEGER;
然后我声明一个变量:
obj t_obj_table;
但是,当我想使用该变量时,我无法对其进行初始化或扩展:
obj := t_obj_table ();
给出以下错误:
PLS-00222: no function with name 'T_OBJ_TABLE' exists in this scope
如果我不初始化它,我不能扩展它来添加一些日期
obj.EXTEND();
给出另一个错误:
PLS-00306: wrong number or types of arguments in call to 'EXTEND'
我怎样才能做到这一点?
【问题讨论】:
【参考方案1】:您不扩展由“某物”索引的表,您可以直接使用它...
DECLARE
TYPE t_simple_object IS RECORD
( wert NUMBER
, gs NUMBER
, vl NUMBER
);
TYPE t_obj_table IS TABLE OF t_simple_object
INDEX BY BINARY_INTEGER;
my_rec t_simple_object;
obj t_obj_table;
BEGIN
my_rec.wert := 1;
my_rec.gs := 1;
my_rec.vl := 1;
obj(1) := my_rec;
END;
/
要使用 EXTEND 语法,这个例子应该这样做......
DECLARE
TYPE t_simple_object IS RECORD
( wert NUMBER
, gs NUMBER
, vl NUMBER
);
TYPE t_obj_table IS TABLE OF t_simple_object;
my_rec t_simple_object;
obj t_obj_table := t_obj_table();
BEGIN
obj.EXTEND;
my_rec.wert := 1;
my_rec.gs := 1;
my_rec.vl := 1;
obj(1) := my_rec;
END;
/
另见this link (Ask Tom)
【讨论】:
【参考方案2】:如果您不想使用关联数组(也称为索引表),请忽略“INDEX BY BINARY_INTEGER”子句。然后你的代码就可以正常工作了:
declare
TYPE t_simple_object IS RECORD (
wert NUMBER,
gs NUMBER,
vl NUMBER);
TYPE t_obj_table IS TABLE OF t_simple_object;
obj t_obj_table;
begin
obj := t_obj_table ();
obj.EXTEND();
end;
【讨论】:
【参考方案3】:您不能扩展关联数组。 只需为其赋值
declare
TYPE t_simple_object IS RECORD (
wert NUMBER,
gs NUMBER,
vl NUMBER);
TYPE t_obj_table IS TABLE OF t_simple_object INDEX BY BINARY_INTEGER;
simple_object t_simple_object;
begin
simple_object.wert := 1;
simple_object.gs := 2;
simple_object.vl := 3;
obj(1) := simple_object;
end;
/
【讨论】:
【参考方案4】:或者只使用一条记录(或关联记录数组)
create or replace package p_test is
type t_rec is record (
empname varchar2(50),
empaddr varchar2(50));
function p_test_ret_record return t_rec;
end p_test;
create or replace package body p_test is
function p_test_ret_record return t_rec is
l_rec t_rec;
begin
l_rec.empname := 'P1';
l_rec.empaddr := 'P2';
return l_rec;
end;
end p_test;
declare
-- Non-scalar parameters require additional processing
result p_test.t_rec;
begin
-- Call the function
result := p_test.p_test_ret_record;
dbms_output.put_line('Name: ' || result.empname || ' Addr: ' || result.empaddr);
end;
【讨论】:
以上是关于如何在pl/sql中判断一个记录变量为空的主要内容,如果未能解决你的问题,请参考以下文章