簡體   English   中英

在Oracle中使用游標將數據插入表中

[英]Insert data into table using cursor in Oracle

我正在學習 pl/sql,並且我有一個使用游標和過程或函數的練習。 該練習需要使用從其他三個表中獲取數據的游標將數據插入到表中(這將是一個支持/視圖表)。

查找下表:

CREATE TABLE t_csc (
nr_csc                      NUMBER NOT NULL,
nr_client                   NUMBER(10) NOT NULL,
cd_product                  NUMBER(10) NOT NULL,
cd_employee                 NUMBER(10),
ds_detail_csc               CLOB,
dt_open_csc                 DATE,
hr_open_csc                 NUMBER(2),
dt_service                  DATE,
hr_service                  NUMBER(2),
nr_time_total_csc           NUMBER(10),
ds_detail_retorn_csc        CLOB,
tp_csc                      CHAR(1) NOT NULL,
st_csc                      CHAR(1),
nr_index_satisfaction       NUMBER(2));


CREATE TABLE t_product (
cd_product         NUMBER(10) NOT NULL,
cd_category        NUMBER NOT NULL,
nr_cd_bar_prod     VARCHAR2(50),
ds_product         VARCHAR2(80) NOT NULL,
vl_unitary         NUMBER(8, 2) NOT NULL,
tp_pack            VARCHAR2(15),
st_product         CHAR(1),
vl_perc_profit     NUMBER(8, 2),
ds_complete_prod   VARCHAR2(4000) NOT NULL);


CREATE TABLE t_category_prod (
cd_category  NUMBER NOT NULL,
tp_category  CHAR(1) NOT NULL,
ds_category  VARCHAR2(500) NOT NULL,
dt_start     DATE,
dt_end       DATE,
st_category  CHAR(1) NOT NULL);

查看表:

CREATE TABLE t_ocurrence (
nr_ocurrence_csc             NUMBER NOT NULL,
dt_open_csc                  DATE,
hr_open_csc                  NUMBER(2),
ds_type_classific_csc        VARCHAR2(30) NOT NULL,
ds_index_satisfac_atd_csc    VARCHAR2(30),
cd_category_prod             NUMBER NOT NULL,
nm_type_category_prod        VARCHAR2(25) NOT NULL,
ds_category_prod             VARCHAR2(500) NOT NULL,
cd_product                   NUMBER(10),
ds_product                   VARCHAR2(80) NOT NULL,
tp_pack                      VARCHAR2(15));

我嘗試了這段代碼但沒有成功:

DECLARE
csc_ocurr t_ocurrence%ROWTYPE; -- Declarando uma variável que vai conter T_MC_SGV_OCORRENCIA
CURSOR cur_search IS -- Cria um cursor chamado cur_search do tipo SELECT
    SELECT CSC.nr_CSC, CSC.dt_open_csc, CSC.hr_open_csc, CSC.tp_csc, CSC.nr_index_satisfaction, CATPROD.cd_category,
    CATPROD.tp_category, CATPROD.ds_category, PROD.cd_product, PROD.ds_product, PROD.tp_pack, PROD.vl_unitary, PROD.vl_perc_profit
        FROM t_csc CSC, t_category_prod CATPROD, t_product PROD
        WHERE CATPROD.cd_category = PROD.cd_category AND PROD.cd_product = CSC.cd_product;

BEGIN
OPEN cur_search;
LOOP
    FETCH cur_search INTO csc_ocurr.nr_ocurrence_csc, csc_ocurr.dt_open_csc, csc_ocurr.hr_open_csc, 
    csc_ocurr.ds_type_classific_csc, csc_ocurr.ds_index_satisfac_atd_csc, csc_ocurr.cd_category_prod, csc_ocurr.nm_type_category_prod,
    csc_ocurr.ds_category_prod, csc_ocurr.cd_product, csc_ocurr.ds_product, csc_ocurr.tp_pack; -- 20
    EXIT WHEN cur_search%notfound;
    INSERT INTO t_ocurrence VALUES (csc_ocurr.nr_ocurrence_csc, csc_ocurr.dt_open_csc, csc_ocurr.hr_open_csc, 
    csc_ocurr.ds_type_classific_csc, csc_ocurr.ds_index_satisfac_atd_csc, csc_ocurr.cd_category_prod, csc_ocurr.nm_type_category_prod,
    csc_ocurr.ds_category_prod, csc_ocurr.cd_product, csc_ocurr.ds_product, csc_ocurr.tp_pack);
END LOOP;
CLOSE cur_search;
END;
/

如果您編寫的查詢返回所需的結果(我不知道;您發布的語句不包含任何參照完整性約束,並且沒有示例數據),那么更簡單的選擇是使用游標FOR循環,因為您不必聲明游標變量,打開游標,獲取,注意退出循環和關閉游標——Oracle 會為你做這些。

另外,請注意INSERT INTO應始終包含您要插入的所有列。 它需要更多的輸入,但它非常清楚(插入到哪一列中的內容)。

INSERT INTO你寫的行不通; 如果您選擇nr_csc ,則不能插入nr_ocurrence_csc ,也必須是nr_csc 一堆其他列也是如此。

最后,在加入表時,明確地這樣做 - 使用JOIN s。 如果您在FROM子句中命名所有表並將它們連接WHERE中,它會起作用(多年來一直如此),但是 - 我們不再生活在 1990年代 為可能的條件/過濾器保留WHERE子句。

所以:

SQL> BEGIN
  2     FOR csc_ocurr
  3        IN (SELECT csc.nr_csc,
  4                   csc.dt_open_csc,
  5                   csc.hr_open_csc,
  6                   csc.tp_csc,
  7                   csc.nr_index_satisfaction,
  8                   catprod.cd_category,
  9                   catprod.tp_category,
 10                   catprod.ds_category,
 11                   prod.cd_product,
 12                   prod.ds_product,
 13                   prod.tp_pack
 14              FROM t_category_prod catprod
 15                   JOIN t_product prod
 16                      ON catprod.cd_category = prod.cd_category
 17                   JOIN t_csc csc ON csc.cd_product = prod.cd_product)
 18     LOOP
 19        INSERT INTO T_OCURRENCE (nr_ocurrence_csc,
 20                                 dt_open_csc,
 21                                 hr_open_csc,
 22                                 ds_type_classific_csc,
 23                                 ds_index_satisfac_atd_csc,
 24                                 cd_category_prod,
 25                                 nm_type_category_prod,
 26                                 ds_category_prod,
 27                                 cd_product,
 28                                 ds_product,
 29                                 tp_pack)
 30             VALUES (csc_ocurr.nr_csc,
 31                     csc_ocurr.dt_open_csc,
 32                     csc_ocurr.hr_open_csc,
 33                     csc_ocurr.tp_csc,
 34                     csc_ocurr.nr_index_satisfaction,
 35                     csc_ocurr.cd_category,
 36                     csc_ocurr.tp_category,
 37                     csc_ocurr.ds_category,
 38                     csc_ocurr.cd_product,
 39                     csc_ocurr.ds_product,
 40                     csc_ocurr.tp_pack);
 41     END LOOP;
 42  END;
 43  /

PL/SQL procedure successfully completed.

SQL>

我嘗試了第二次,但現在我在一個過程中聲明了變量。 之后,我使用游標從表T_CSCT_PRODUCT T_CATEGORY_PROD中獲取數據,並在打開FETCH的情況下將數據提取到聲明的變量中,然后使用INSERT INTO填充T_OCURRENCE表。

CREATE OR REPLACE PROCEDURE pr_ocurrence AS

v_nr_ocurrence_csc             T_CSC.nr_csc%TYPE,
v_dt_open_csc                  T_CSC.dt_open_csc%TYPE,
v_hr_open_csc                  T_CSC.hr_open_csc%TYPE,
v_ds_type_classific_csc        T_CSC.tp_csc%TYPE,
v_ds_index_satisfac_atd_csc    T_CSC.nr_index_satisfaction%TYPE,
v_cd_category_prod             T_CATEGORY_PROD.cd_category%TYPE,
v_nm_type_category_prod        T_CATEGORY_PROD.tp_category%TYPE,
v_ds_category_prod             T_CATEGORY_PROD.ds_category%TYPE,
v_cd_product                   T_PRODUCT.cd_product%TYPE,
v_ds_product                   T_PRODUCT.ds_product%TYPE,
v_tp_pack                      T_PRODUCT.tp_pack%TYPE;

    CURSOR cur_search IS
    SELECT CSC.nr_CSC, CSC.dt_open_csc, CSC.hr_open_csc, CSC.tp_csc, CSC.nr_index_satisfaction, CATPROD.cd_category,
    CATPROD.tp_category, CATPROD.ds_category, PROD.cd_product, PROD.ds_product, PROD.tp_pack, PROD.vl_unitary, PROD.vl_perc_profit
        FROM t_category_prod CATPROD
            JOIN t_product PROD ON CATPROD.cd_category = PROD.cd_categor
            JOIN t_csc CSC ON CSC.cd_product = PROD.cd_product;

BEGIN
    OPEN cur_search;
    LOOP
        FETCH cur_search INTO v_nr_ocurrence_csc, v_dt_open_csc, v_hr_open_csc, v_ds_type_classific_csc, v_ds_index_satisfac_atd_csc, v_cd_category_prod, v_nm_type_category_prod,
            v_ds_category_prod, v_cd_product, v_ds_product, v_tp_pack;
        EXIT WHEN cur_search%NOTFOUND;

        INSERT INTO T_OCURRENCE VALUES (v_nr_ocurrence_csc, v_dt_open_csc, v_hr_open_csc, v_ds_type_classific_csc, v_ds_index_satisfac_atd_csc, v_cd_category_prod, v_nm_type_category_prod,
            v_ds_category_prod, v_cd_product, v_ds_product, v_tp_pack);
    END LOOP;
END pr_ocurrence;
/

EXECUTE pr_ocurrence();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM