【问题标题】:How Can I insert data in a table using an associative array?如何使用关联数组在表中插入数据?
【发布时间】:2017-06-18 13:47:05
【问题描述】:

我已经使用来自游标的信息填充了一个关联数组,现在我想将关联数组信息插入到一个表中。这怎么可能?考虑关联数组是从记录创建的。

SET SERVEROUTPUT ON

DECLARE
  TYPE rec_depts_info IS RECORD(
      v_dept_id   departments.department_id%TYPE,
      v_dept_name departments.department_name%TYPE);
  TYPE typ_depts_info IS TABLE OF rec_depts_info
      INDEX BY PLS_INTEGER;

  CURSOR cur_depts_info_1
  IS
     SELECT department_id, department_name
     FROM   departments
     WHERE  department_id   IS NOT NULL
     AND    department_name IS NOT NULL;

  t_depts_info_1 typ_depts_info;
  rec_depts_info_1 rec_depts_info;

  v_counter_1 PLS_INTEGER := 1;
  v_counter_2 PLS_INTEGER := 1;
BEGIN
  v_counter_1 := v_counter_1 + 1;

  FOR depts_info IN cur_depts_info_1
  LOOP
      t_depts_info_1(v_counter_1).v_dept_id   := depts_info.department_id;
      t_depts_info_1(v_counter_1).v_dept_name := depts_info.department_name;

      EXIT WHEN cur_depts_info_1%NOTFOUND;

  END LOOP;

  LOOP
    INSERT INTO tabla_pruebas
    VALUES(t_depts_info_1(v_counter_2).v_dept_id,
           t_depts_info_1(v_counter_2).v_dept_name)
    RETURNING column_1, column_2
    INTO      rec_depts_info_1.v_dept_id, rec_depts_info_1.v_dept_name;

    DBMS_OUTPUT.PUT_LINE('DEPT ID: ' || rec_depts_info_1(v_counter_2).v_dept_id
                         || ' DEPT NAME: ' ||
                         rec_depts_info_1(v_counter_2).v_dept_name);

    v_counter_2 := v_counter_2 + 1;

    EXIT WHEN SQL%NOTFOUND;
  END LOOP;
END;

我正在尝试使用简单的 LOOP 将数据插入新表中,但收到以下错误:

Informe de error -
ORA-06550: line 51, column 41:
PLS-00222: no function with name 'REC_DEPTS_INFO_1' exists in this scope
ORA-06550: line 51, column 5:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

谢谢!!!

【问题讨论】:

  • 您对 PLS-0222 错误的解释是什么?
  • 你试图在这里使用记录作为数组rec_depts_info_1(v_counter_2).v_dept_id。选项:使用正确的数组t_depts_info_1(v_counter_2).v_dept_id 或记录rec_depts_info_1.v_dept_id
  • 谢谢,但现在我收到“NO DATA FOUND”错误。
  • 这是v_counter_1 以 2 开头而第二个计数器以 1 开头的结果。为什么在循环外递增 v_counter_1
  • 对索引表更好地使用批量操作(选择和插入)。那段代码的真正目的是什么?

标签: sql oracle plsql associative-array insert-into


【解决方案1】:

您可以使用 the FORALL bulk syntax 一次性插入所有数组值,而不是显式循环:

  FORALL i IN t_depts_info_1.first..t_depts_info_1.last
    INSERT INTO tabla_pruebas
    VALUES(t_depts_info_1(i).v_dept_id,
           t_depts_info_1(i).v_dept_name);

Read more 关于FORALL 和其他批量查询和绑定主题。使用BULK COLLECT 来填充您的数组,您可以将代码简化为:

DECLARE
  TYPE rec_depts_info IS RECORD(
      v_dept_id   departments.department_id%TYPE,
      v_dept_name departments.department_name%TYPE);
  TYPE typ_depts_info IS TABLE OF rec_depts_info
      INDEX BY PLS_INTEGER;

  t_depts_info_1 typ_depts_info;
BEGIN
  SELECT department_id, department_name
  BULK COLLECT INTO t_depts_info_1
  FROM   departments
  WHERE  department_id   IS NOT NULL
  AND    department_name IS NOT NULL;

  FORALL i IN t_depts_info_1.first..t_depts_info_1.last
    INSERT INTO tabla_pruebas
    VALUES(t_depts_info_1(i).v_dept_id,
           t_depts_info_1(i).v_dept_name);
END;
/

虽然使用这个人为的示例,您根本不需要集合或任何 PL/SQL,但您可以做一个简单的insert...select

INSERT INTO tabla_pruebas (column_1, column_2)
SELECT department_id, department_name
FROM   departments
WHERE  department_id   IS NOT NULL
AND    department_name IS NOT NULL;

【讨论】:

  • 我明白了!非常感谢你的帮助。我需要练习更多的PLSQL!!!这很有帮助。再次感谢!!!
猜你喜欢
  • 1970-01-01
  • 2014-11-15
  • 2023-03-29
  • 1970-01-01
  • 2018-02-11
  • 2017-06-24
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
相关资源
最近更新 更多