简体   繁体   English

如何在过程中更新刚刚更改的全局临时表? pl/sql

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

have to alter table and update the values in altered temporary table.必须更改表并更新已更改临时表中的值。 Is it possible to solve this problem or should I fulfill temporary table using loop instead of INSERT INTO ttb_customers SELECT * FROM CUSTOMERS;是否可以解决这个问题或者我应该使用循环而不是INSERT INTO ttb_customers SELECT * FROM CUSTOMERS; ? ?

But the problem is I need a procedure to run in a job.但问题是我需要一个程序来运行工作。 I have two tables, they are similar and on of them is expanded.我有两张桌子,它们很相似,并且其中一张被扩展了。 I need to migrate data from one table to another expanded table and fulfill with values depending on other values.我需要将数据从一个表迁移到另一个扩展表,并根据其他值实现值。

Here I made the little example how it looks like.在这里,我做了一个小例子,它的样子。

  -- 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;

You can run it with out a procedure您可以在没有程序的情况下运行它

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 | EMAIL | NAME |姓名 | UBI |育碧 | SALARY:------------ |:---- |薪水:------------ |:---- | --: | --: | -----: tom@basic.com | -----: tom@basic.com | tom |汤姆| 100 | 100 | 499 James@lux.com |第499章James |詹姆斯 | 0 | 0 | 591 591

db<>fiddle here db<> 在这里摆弄

And why not do it all in just one SQL, like this where END_TABLE is your 'normal' final table, not a GTT:为什么不在一个 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;

Do you really need a GTT?你真的需要GTT吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM