[英]How to Insert data using cursor into new table having single column containing XML type data in 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_CSC
、 T_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.