暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何使用大容量插入使pl/sql表成为过程中的可选参数

askTom 2013-06-04
244

问题描述

嗨,汤姆,

提前感谢您回答我的问题。我有一个需要更改的现有过程,我想添加一个可选的pl/sql表作为参数,它也使用大容量插入。这个过程也从各种其他包调用,所以我不希望这些包受到影响。

当我们在没有可选参数的情况下调用此函数时,我将得到一个oracle错误“gtORA-22160 :索引【1】处的元素不存在。请告诉我如何修复此问题。

谢谢,
查兰

创建表test_gt
(列1号,
第2列编号) ;

下面是示例代码

创建或替换包charan_test
组件
类型盖_gtbl_type IS表emp.empno%TYPE
BINARY_INTEGER索引;

gt_ledger_id盖_gtbl_type ;

类型秒_id_int1_gtbl_type IS部门表编号%TYPE
BINARY_INTEGER索引;



程序主程序(
p_ledger_id_tbl IN盖_gtbl_type ,
tbl IN sec_id_int1_gtbl_type DEFAULT C组件T (
NULL 组件 sec_id_int1_gtbl_type));
结束;
/

创建或替换包体charan_test
组件
程序主程序(
p_ledger_id_tbl IN盖_gtbl_type ,
tbl IN sec_id_int1_gtbl_type DEFAULT C组件T (
NULL 组件 sec_id_int1_gtbl_type))

开始
中频p_ledger_id_tbl.计数<> 0
那么
对于所有的我在1。p_ledger_id_tbl.计数
INSERT到test_gt (第1列,第2列)
值(p_ledger_id_tbl (i),tbl (i)) ;
结束IF ;
例外
当其他人
那么
提高;
结束;
结束;
/

专家解答

EXCEPTION 
WHEN OTHERS 
THEN 
RAISE; 
END;


我讨厌这样。为什么-为什么为什么为什么-为什么你要这么做?你真的想让调试代码变得更难,不是吗...构造的唯一功能就是从你身上删除信息- -它隐藏行号。唉。

请不要说“这只是一个演示”,如果你不在现实生活中做类似的事情,为什么你会不辞辛劳地把它放在演示中呢?请停止这种做法。


ops$tkyte%ORA11GR2> create table test_gt
  2  (column1 number,
  3  column2 number);

Table created.

ops$tkyte%ORA11GR2> 
ops$tkyte%ORA11GR2> 
ops$tkyte%ORA11GR2> CREATE OR REPLACE PACKAGE charan_test
  2  AS
  3      TYPE lid_gtbl_type IS TABLE OF number INDEX BY BINARY_INTEGER;
  4      TYPE sec_id_int1_gtbl_type IS TABLE OF number INDEX BY BINARY_INTEGER;
  5  
  6      gt_ledger_id lid_gtbl_type;
  7  
  8      PROCEDURE main
  9      ( p_ledger_id_tbl IN lid_gtbl_type,
 10        tbl IN sec_id_int1_gtbl_type DEFAULT cast( null as sec_id_int1_gtbl_type) );
 11  
 12  END;
 13  /

Package created.

ops$tkyte%ORA11GR2> show errors
No errors.
ops$tkyte%ORA11GR2> 
ops$tkyte%ORA11GR2> 
ops$tkyte%ORA11GR2> CREATE OR REPLACE PACKAGE BODY charan_test
  2  AS
  3  
  4  PROCEDURE main
  5  ( p_ledger_id_tbl IN lid_gtbl_type,
  6    tbl IN sec_id_int1_gtbl_type DEFAULT cast( null as sec_id_int1_gtbl_type) )
  7  as
  8  begin
  9  
 10      if ( tbl.count = p_ledger_id_tbl.count )
 11      then
 12          FORALL i IN 1 .. p_ledger_id_tbl.COUNT
 13              INSERT INTO test_gt (column1, column2)
 14              VALUES (p_ledger_id_tbl (i), tbl (i));
 15      else
 16          forall i in 1.. p_ledger_id_tbl.count
 17              insert into test_gt(column1)
 18              values( p_ledger_id_tbl(i) );
 19      end if;
 20  end;
 21  end;
 22  /

Package body created.

ops$tkyte%ORA11GR2> 
ops$tkyte%ORA11GR2> declare
  2      l_data1 charan_test.lid_gtbl_type;
  3      l_data2 charan_test.sec_id_int1_gtbl_type;
  4  begin
  5      l_data1(1) := 100;
  6      l_data1(2) := 200;
  7      l_data2(1) := 1000;
  8      l_data2(2) := 2000;
  9      charan_test.main( l_data1 );
 10      charan_test.main( l_data1, l_data2 );
 11  end;
 12  /

PL/SQL procedure successfully completed.

ops$tkyte%ORA11GR2> 
ops$tkyte%ORA11GR2> select * from test_gt;

   COLUMN1    COLUMN2
---------- ----------
       100
       200
       100       1000
       200       2000

ops$tkyte%ORA11GR2> 

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论