2011-05-23 63 views
3

我必須做一個大的更新腳本 - 不是SPL(存儲過程)。這是爲Informix數據庫編寫的。Informix腳本中的局部變量

它涉及將行插入到多個表中,每個表都依賴於插入到前一個表中的序列。

我知道我可以做這個可以訪問串行:

SELECT DISTINCT dbinfo('sqlca.sqlerrd1') FROM systables 

,但我似乎無法定義本地變量插入到下表之前保存這些。

我想這樣做:

insert into table1 (serial, data1, data2) values (0, 'newdata1', 'newdata2'); 
define serial1 as int; 
let serial1 = SELECT DISTINCT dbinfo('sqlca.sqlerrd1') FROM systables; 
insert into table2 (serial, data1, data2) values (0, serial1, 'newdata3'); 

但當然的Informix的定義線路電抗器。

有沒有辦法做到這一點,而不必創建這個存儲過程,運行一次,然後刪除過程?

回答

2

如果涉及的表中的列數是作爲你的例子少,那麼你可以做的SPL永久性的,並用它來將您的數據,即:

EXECUTE PROCEDURE insert_related_tables('newdata1','newdata2','newdata3');

顯然,這沒有按這個比例非常好,但對你的例子來說沒問題。

是擴展了喬納森的例子,解決了因使用MAX(中可能出現的任何併發問題的另一種思路)將包括DBINFO('sessionid')Table3

DELETE FROM Table3 WHERE sessionid = DBINFO('sessionid'); 
INSERT INTO Table1 (...); 
INSERT INTO Table3 (sessionid, value) 
    VALUES (DBINFO('sessionid'), DBINFO('sqlca.sqlerrd1')); 
INSERT INTO Table2 
    VALUES (0, (SELECT value FROM Table3 
       WHERE sessionid = DBINFO('sessionid'), 'newdata3'); 
... 

你也可以將Table3一個TEMP表:

INSERT INTO Table1 (...); 
SELECT DISTINCT DBINFO('sqlca.sqlerrd1') AS serial_value 
    FROM some_dummy_table_like_systables 
INTO TEMP Table3 WITH NO LOG; 
INSERT INTO Table2 (...); 
+0

我省略了我的Table3中的TEMP,這導致了併發問題;因爲它只是一個臨時表,所以沒有併發問題,因爲它只保存當前會話的值。我在任何地方都用TEMP寫了SQL,並且非常熱衷於刪除TEMP。好點,但。 – 2011-05-25 23:48:17

0

Informix不會爲存儲過程提供所需類型的「本地變量」以外的機制。但是,在您提供的有限示例中,它的工作原理如下:

CREATE TABLE Table1 
(
    serial SERIAL(123) NOT NULL, 
    data1 VARCHAR(32) NOT NULL, 
    data2 VARCHAR(32) NOT NULL 
); 
CREATE TABLE Table2 
(
    serial SERIAL  NOT NULL, 
    data1 INTEGER  NOT NULL, 
    data2 VARCHAR(32) NOT NULL 
); 

INSERT INTO Table1(Serial, Data1, Data2) 
    VALUES(0, 'newdata1', 'newdata2'); 
INSERT INTO Table2(Serial, Data1, Data2) 
    VALUES(0, DBINFO('sqlca.sqlerrd1'), 'newdata3'); 

SELECT * FROM Table1; 

123 newdata1  newdata2 

SELECT * FROM Table2; 

1  123   newdata3 

但是,這僅適用於您需要向Table2中插入一行的工作。如果您需要插入更多,該技術將無法正常工作。你可以,我想,使用:

CREATE TEMP TABLE Table3 
(
    value INTEGER NOT NULL 
); 

INSERT INTO Table1(Serial, Data1, Data2) 
    VALUES(0, 'newdata1', 'newdata2'); 
INSERT INTO Table3(Value) 
    VALUES(DBINFO('sqlca.sqlerrd1')); 
INSERT INTO Table2(Serial, Data1, Data2) 
    VALUES(0, (SELECT MAX(value) FROM Table3), 'newdata3'); 
INSERT INTO Table2(Serial, Data1, Data2) 
    VALUES(0, (SELECT MAX(value) FROM Table3), 'newdata4'); 

等等...表3的臨時表避免了併發和MAX()的問題。