2012-07-25 104 views
0

我有一些插入語句,如下面顯示的那樣,我嘗試在一個大塊中運行。有無論如何,我告訴查詢跳過該特定的插入語句,並繼續在其中一個選擇語句的列表返回null?如果沒有發現結果,sql跳過插入語句

insert into V1144engine.T_edges(edge_id, version, node1_id, node2_id, edge_type_id, created_at, weight,deleted_at) VALUES(V1144ENGINE.S_PK_EDGES.NEXTVAL,0,(Select node_id from V1144engine.T_nodes where node_name = 'Writing an Equation of a Perpendicular Line' and rownum=1),(select node_id from V1144engine.T_nodes where node_name = 'slope'and node_type_id =11),5,SYSDATE,5.318,null); 

    insert into V1144engine.T_edges(edge_id, version, node1_id, node2_id, edge_type_id, created_at, weight,deleted_at) VALUES(V1144ENGINE.S_PK_EDGES.NEXTVAL,0,(Select node_id from V1144engine.T_nodes where node_name = 'Writing an Equation of a Perpendicular Line' and rownum=1),(select node_id from V1144engine.T_nodes where node_name = 'vertic'and node_type_id =11),5,SYSDATE,5,null); 
+0

當你說一個大的塊,你的意思只是一堆單一的INSERT語句?如果這是一個PL/SQL過程,你可以使用'IF'語句和光標循環(如果這些將適用/有幫助) – Dan 2012-07-25 19:08:24

+0

是的,我的意思是一堆單插入語句,但它不會作爲PL/SQL過程運行,感謝您的建議,儘管 – 2012-07-25 19:12:38

+1

您使用什麼程序來執行SQL語句?在SQL * Plus? SQL Developer?還有別的嗎?如果你不使用PL/SQL塊,該應用程序將控制一個語句失敗時發生的情況。默認的SQL * Plus和SQL Developer的行爲將會繼續下一個聲明,這聽起來像是你想要的行爲。 – 2012-07-25 19:38:25

回答

1

我把它包裝成一個select ... from dual或限制在node1|2_id IS NOT NULL

INSERT INTO v1144engine.t_edges (edge_id 
           ,version 
           ,node1_id 
           ,node2_id 
           ,edge_type_id 
           ,created_at 
           ,weight 
           ,deleted_at 
           ) 
SELECT * 
     FROM (
      SELECT 
        v1144engine.s_pk_edges.NEXTVAL edge_id 
        ,0        version 
        , (SELECT node1_id 
         FROM v1144engine.t_nodes 
         WHERE node_name = 'Writing an Equation of a Perpendicular Line' 
         AND ROWNUM = 1)   node1_id 
        , (SELECT node_id 
         FROM v1144engine.t_nodes 
         WHERE node_name = 'slope' 
         AND node_type_id = 11) node2_id 
        ,5  edge_type_id 
        ,SYSDATE      created_at 
        ,5.318       weight 
        ,NULL       deleted_at 
       FROM dual 
      ) 
     WHERE node1_id IS NOT NULL 
     AND node2_id IS NOT NULL 
; 
0

爲什麼不直接把選擇放到臨時表中,然後從中生成動態SQL?

+0

,因爲我們所有的node_id都是從每個機器上不同的序列生成的,所以它必須從這個插入語句中進行選擇,靜態ID將不起作用。 – 2012-07-25 19:11:24

+0

你可以把這些語句放到一個表中,並循環使用一個遊標來檢查行數。如果在插入後行計數沒有增加,就知道它失敗了。 – 2012-07-25 19:17:51

+0

好吧,這樣的工作,但它仍然非常乏味,因爲我添加更新和插入語句,當我發現一個錯誤,我仍然需要手動刪除它。任何想法如何解決這個問題? – 2012-07-25 19:31:18

1

你可以複製嵌套SELECT S的謂詞EXISTS條款:

INSERT INTO v1144engine.t_edges (
    edge_id 
, version 
, node1_id 
, node2_id 
, edge_type_id 
, created_at 
, weight 
, deleted_at 
) 
SELECT v1144engine.s_pk_edges.NEXTVAL 
,  0 
,  (SELECT node_id 
     FROM v1144engine.t_nodes 
     WHERE node_name = 'Writing an Equation of a Perpendicular Line' 
     AND ROWNUM = 1) 
,  (SELECT node_id 
     FROM v1144engine.t_nodes 
     WHERE node_name = 'slope' 
     AND node_type_id = 11) 
,  5 
,  SYSDATE 
,  5.318 
,  TO_DATE(NULL) 
FROM DUAL 
WHERE EXISTS (SELECT NULL 
       FROM v1144engine.t_nodes 
       WHERE node_name = 'Writing an Equation of a Perpendicular Line') 
AND EXISTS (SELECT NULL 
       FROM v1144engine.t_nodes 
       WHERE node_name = 'slope' 
       AND node_type_id = 11); 

我不知道你有多少這些,但是,作爲替代方案,或許像下面這樣的轉變將起作用,因爲更多的是基於集合的方法?

INSERT INTO v1144engine.t_edges (
    edge_id 
, version 
, node1_id 
, node2_id 
, edge_type_id 
, created_at 
, weight 
, deleted_at 
) 
SELECT v1144engine.s_pk_edges.NEXTVAL 
,  0 
,  MAX(CASE 
      WHEN node_name = 'Writing an Equation of a Perpendicular Line' 
      THEN node_id 
      END) 
,  MAX(CASE 
      WHEN node_name = 'slope' 
      AND node_type_id = 11 
      THEN node_id 
      END) 
,  5 
,  SYSDATE 
,  5.318 
,  TO_DATE(NULL) 
FROM v1144engine.t_nodes 
WHERE node_name IN ('Writing an Equation of a Perpendicular Line','slope') 
HAVING MAX(CASE 
      WHEN node_name = 'Writing an Equation of a Perpendicular Line' 
      THEN node_id 
      END) IS NOT NULL 
AND MAX(CASE 
      WHEN node_name = 'slope' 
      AND node_type_id = 11 
      THEN node_id 
      END) IS NOT NULL 
; 

(警告:未經測試的代碼。)