物件表與PLSQL表型別 比較

2021-09-08 02:41:01 字數 2779 閱讀 6416

一直以來,對這兩種型別一直存有疑惑,現在將自己的一些想法實驗記錄下來,以便以後檢視跟蹤改進。

plsql表變數型別

type typ_id_record is record(

gid number(10),

gno number(5),

co number(5));

type typ_id_table1 is table of typ_id_record;

物件表變數型別

create or replace type typ_id_object as object

(gid number(10),

gno number(5),

co number(5));

create or replace type typ_id_table as table of typ_id_object;

1.bulk collect的使用的區別

plsql變數可以直接接收bulk collect,但是物件表變數就必須先進行轉換

ora-00932: 資料型別不一致

create or replace procedure p_f2 is

tab_ids typ_id_table;

begin

select gp.gid, gp.gno, gp.co   bulk collect

into tab_ids

from p_table_test gp;

end p_f2;

解決辦法:將object變數進行轉換,如下所示:

create or replace procedure p_f2 is

tab_ids typ_id_table;

begin

select

typ_id_object(gp.gid, gp.gno, gp.co)   bulk collect

into tab_ids

from p_table_test gp;

end p_f2;

如果採用的是plsql表變數,則直接接受查詢的結果集就可以了,如下所示:

create or replace procedure p_f4 is

tab_ids typ_id_table1;

begin

select gp.gid, gp.gno, gp.co bulk collect

into tab_ids

from p_table_test gp;

end p_f4;

在此,要感謝itpub的windtalker_cs,是他的回答讓我明白了一直困擾我的乙個問題,之前一直以為如果採用object

物件表,就無法使用bulk collect批量獲取結果集。

2. 是否可以使用table函式

函式返回的若是plsql型別變數則無法使用table函式,而object型別變數可以使用table函式直接獲取函式返回的結果集

create or replace function p_f2 return typ_id_table is

tab_fids typ_id_table := typ_id_table();

--object物件表型別

begin

for i in 1 .. 100 loop

tab_fids.extend;

tab_fids(tab_fids.count) := typ_id_object(i, i + 1, i + 2);

end loop;

return tab_fids;

end p_f2;

sql> select * from

table(p_f2);

fid    gno     co

----------- ------ ------

1      2      3

2      3      4

3      4      5

4      5      6

5      6      7

6      7      8

........................

如果函式返回的是record表型別,則無法使用table函式,如下所示:

create or replace package pkg_f2 is

type typ_id_record is record(

gid number(10),

gno number(5),

co  number(5));

type typ_id_table1 is table of typ_id_record;  --在包頭定義plsql表型別

function f_f2 return typ_id_table1;

end pkg_f2;

create or replace package body pkg_f2 is

function f_f2 return typ_id_table1 is

tab_fids typ_id_table1;

begin

select rownum, rownum + 1, rownum + 2 bulk collect

into tab_fids

from dual;

return tab_fids;

end;

end pkg_f2;

select * from table(pkg_f2.f_f2);

error: pls-00642: 在 sql 語句中不允許使用本地收集型別

使用復合資料型別 PL SQL表

pl sql表也稱為索引表,它類似於高階語言的一維陣列。p sql記錄用於處理單行多列資料,而pl sql表用於處理多行單列資料。注意 高階語言陣列的元素個數是有限制的,而且下標不能為負 而pl sql表的元素個數沒有限制,而且下標可以為負 使用pl sql表處理單行單列資料 例子 根據雇員號輸出雇...

PL SQL引數作為表

create or replace procedure sign reject is mail list long context long r mail varchar2 50 a mail varchar2 50 sqlstr1 long sqlstr2 long begin context i...

pl sql建立表空間

pl sql建立表空間 2008 11 18 00 33 通過pl sql登入到oracle資料庫上,然後執行選單 檔案 新建 命令視窗 開啟乙個命令視窗然後在該命 令視窗中執行指令碼建立和刪除表空間 建立表空間 create tablespace mof temp datafile d oracl...