Mic*_*ber 3 oracle stored-procedures exists user-defined-types
我创建一个简单的类型:
create or replace TYPE SIMPLE_TYPE AS OBJECT (ID NUMBER(38), NAME VARCHAR2(20));
Run Code Online (Sandbox Code Playgroud)
简单测试:
DECLARE
TYPE ObjectList IS TABLE OF SIMPLE_TYPE;
tmp SIMPLE_TYPE := SIMPLE_TYPE(1, 'a');
o ObjectList := new ObjectList(SIMPLE_TYPE(2, 'a'), SIMPLE_TYPE(3, 'a'));
BEGIN
IF tmp.EXISTS(tmp) THEN
dbms_output.put_line('OK, exists.');
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
我得到一个例外:PLS-00302:必须声明组件'EXISTS'
但这个例子工作:
DECLARE
TYPE NumList IS TABLE OF INTEGER;
n NumList := NumList(1,3,5,7);
BEGIN
n.DELETE(2);
IF n.EXISTS(1) THEN
dbms_output.put_line('OK, element #1 exists.');
END IF;
IF n.EXISTS(3) = FALSE THEN
dbms_output.put_line('OK, element #2 has been deleted.');
END IF;
IF n.EXISTS(99) = FALSE THEN
dbms_output.put_line('OK, element #99 does not exist at all.');
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
是否可以在SIMPLE_TYPE类型中实现EXISTS方法?
正如文档所述,EXISTS()测试集合中是否存在编号的条目.也就是说,array.exists(3)断言array填充了第三个元素.
您在第一个示例中尝试执行的操作是测试实例是否tmp与元素匹配ObjectList.从10g开始,我们可以使用MEMBER OF语法来完成此操作.不幸的是,为了完成这项工作,我们必须声明一个MAP方法,这个方法相当笨拙,如果对象有很多属性,会变得相当烦人.
SQL> create or replace type simple_type as object
2 ( id number
3 , name varchar2(30)
4 , map member function compare return varchar2);
5 /
Type created.
SQL>
SQL> create or replace type body simple_type as
2 map member function compare return varchar2
3 is
4 return_value integer;
5 begin
6 return to_char(id, '0000000')||name;
7 end compare;
8 end;
9 /
Type body created.
SQL>
Run Code Online (Sandbox Code Playgroud)
运行示例......
SQL> set serveroutput on size unlimited
SQL>
SQL> declare
2 type objectlist is table of simple_type;
3 tmp simple_type := simple_type(1, 'a');
4 o objectlist := new objectlist(simple_type(2, 'a'), simple_type(3, 'a'));
5 begin
6 if tmp MEMBER OF o then
7 dbms_output.put_line('ok, exists.');
8 else
9 dbms_output.put_line('search me');
10 end if;
11 end;
12 /
search me
PL/SQL procedure successfully completed.
SQL>
Run Code Online (Sandbox Code Playgroud)
tmp SIMPLE_TYPEE := SIMPLE_TYPE(1, 'a');\n\n\xe2\x80\xa6\n\nIF tmp.EXISTS(tmp) THEN\nRun Code Online (Sandbox Code Playgroud)\n\n您声明tmp为SIMPLE_TYPE, 不是ObjectList。
SIMPLE_TYPE是标量类型,而不是集合。
可能你想检查一下o.EXISTS(这是一个ObjectList)?
更新:
\n\nEXISTS当应用于集合时,采用整数索引作为参数,并检查具有该索引的元素是否存在(而不是其值)。
检查一下SIMPLE_TYPE(1, 'a')表中是否存在该文件,您应该执行以下操作:
创造ObjectList在字典中
CREATE TYPE ObjectList IS TABLE OF SIMPLE_TYPE;\nRun Code Online (Sandbox Code Playgroud)\n\n发出SELECT查询:
DECLARE\n tmp SIMPLE_TYPE := SIMPLE_TYPE(1, 'a');\n o ObjectList := new ObjectList(SIMPLE_TYPE(2, 'a'), SIMPLE_TYPE(3, 'a'));\n myid INT;\nBEGIN\n SELECT 1\n INTO myid\n FROM TABLE(o) q\n WHERE SIMPLE_TYPE(q.id, q.name) = tmp\n AND rownum = 1;\n IF (myid = 1) THEN\n dbms_output.put_line('OK, exists.');\n END IF;\nEND;\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
29964 次 |
| 最近记录: |