簡體   English   中英

如何在過程中更新剛剛更改的全局臨時表? pl/sql

[英]How to update just altered global temporary table in procedure? pl/sql

必須更改表並更新已更改臨時表中的值。 是否可以解決這個問題或者我應該使用循環而不是INSERT INTO ttb_customers SELECT * FROM CUSTOMERS; ?

但問題是我需要一個程序來運行工作。 我有兩張桌子,它們很相似,並且其中一張被擴展了。 我需要將數據從一個表遷移到另一個擴展表,並根據其他值實現值。

在這里,我做了一個小例子,它的樣子。

  -- create trmporaty table
    CREATE GLOBAL TEMPORARY TABLE ttb_customers
    ON COMMIT DELETE ROWS
    AS SELECT * FROM customers WHERE 1=0;



CREATE OR REPLACE PROCEDURE ADD_MISSING_ROWS IS
BEGIN
    EXECUTE IMMEDIATE 'ALTER TABLE ttb_customers ADD(
        email users.email%type,
        ubi number(20)
    ) ON COMMIT DELETE ROWS';
END;

CREATE OR REPLACE PROCEDURE migrate_customers IS
    email_ USERS.EMAIL%type;
    ubi_ number(20) := 0;
BEGIN
    INSERT INTO ttb_customers SELECT * FROM CUSTOMERS;

    ADD_MISSING_ROWS;

    FOR i IN (SELECT * FROM ttb_customers) LOOP
        IF i.SALARY > 500 THEN
            email_ := CONCAT(i.NAME, '@lux.com');
            ubi_ := 0;
        ELSE
            email_ := CONCAT(i.NAME, '@basic.com');
            ubi_ := 100;
        END IF;

        -- this part does not work
        UPDATE ttb_customers SET email=email_, ubi=ubi_ WHERE ID=i.ID;
    
    END LOOP;
END;

您可以在沒有程序的情況下運行它

CREATE TABLE ttb_customers (email varchar2(100), name varchar2(100), ubi int, salary int)
 INSERT INTO ttb_customers VALUES('test@test.com','tom', -1, 499)
 INSERT INTO ttb_customers VALUES('test@test.com','James', -1, 591)
 UPDATE ttb_customers SET email= CASE WHEN SALARY > 500 THEN CONCAT(NAME, '@lux.com') ELSE CONCAT(NAME, '@basic.com') END, ubi= CASE WHEN SALARY > 500 THEN 0 ELSE 100 END
 SELECT * FROM ttb_customers
  EMAIL | 姓名 | 育碧 | 薪水:------------ |:---- |  --: |  -----: tom@basic.com | 湯姆|  100 | 第499章詹姆斯 |  0 |  591

db<> 在這里擺弄

為什么不在一個 SQL 中完成所有操作,就像這樣,END_TABLE 是您的“正常”決賽桌,而不是 GTT:

Insert into end_table (....,email,ubi)
select t.*,
CASE WHEN SALARY > 500  THEN CONCAT(NAME, '@lux.com')
ELSE CONCAT(NAME, '@basic.com') END ,
 CASE WHEN SALARY > 500  THEN 0 ELSE 100 END 
from ttb_customers;

你真的需要GTT嗎?

暫無
暫無

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

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