2017-06-06 185 views
0

我正在嘗試將類似下面的東西的一個oracle程序轉換爲Netezza,並在執行時遇到一些問題,沒有編譯錯誤。該過程在Oracle中成功執行。關於此任務,它是批處理過程,無需返回或採用輸入參數,並循環遍歷一個表來動態地準備SQL語句。由於Oracle不存在任何問題,因此邏輯建立良好。Netezza存儲過程錯誤

CREATE OR REPLACE PROCEDURE proc1() 
    RETURNS CHARACTER VARYING (ANY) EXECUTE AS OWNER LANGUAGE NZPLSQL AS 
BEGIN_PROC 

DECLARE 

lv_sql varchar(4000); 
lv1 varchar(4000); 
lv2 varchar(4000); 
lv3 varchar(4000); 
lv4 varchar(4000); 
lv5 varchar(4000); 
lv_value varchar(1000); 
lv_str_cnt integer; 
lv_ret_string VARCHAR(1000); 

BEGIN 
    FOR c1 IN (SELECT * from test) 
    LOOP 
      IF lv_str_cnt = 0 THEN 
       lv_ret_string := '''' || c1.col1 || ''''; 
      ELSE IF lv_str_cnt IS NULL THEN 
       lv_ret_string := NULL; 
      ELSE 
       lv_ret_string := '''' || c1.col2 || ''''; 
      END IF; 
      ............. 
      ............. 

     lv_sql := lv_sql || lv1 || lv2 || lv3 || lv4; 

     EXECUTE IMMEDIATE lv_sql; 

    END LOOP; 

END; 
END_PROC; 

我收到以下錯誤,當程序執行 「語法錯誤,意想不到的WORD在VARCHAR2或接近」

VARCHAR2是Oracle數據類型,我可以確認被修改爲Netezza公司爲VARCHAR在我的程序在所有地方。我在谷歌搜索找到創建一個程序很好的例子,但不幸的是我無法得到理想的幫助。

此外還有特定的塊代碼,我想創建作爲功能並重新使用它。不幸的是,它也使用了函數語法。

感謝您的幫助

+0

Netezza中沒有VARCHAR2。使用NVARCHAR。檢查lv_ret_string的類型。 – HGF

+0

@HGF,是的同意,我已經在Lars指出後進行了修改。我也在編輯這個主題。但我仍然以相同的錯誤結束。 – Venkat

+0

@HGF,有什麼需要光標的循環嗎? – Venkat

回答

0

我覺得現在是時候回到我自己的問題回答。

CREATE OR REPLACE PROCEDURE proc1() 
    RETURNS CHARACTER VARYING (ANY) EXECUTE AS OWNER LANGUAGE NZPLSQL AS 
BEGIN_PROC 

DECLARE 
c1  RECORD; 
v_sql text; 

lv_sql varchar(4000); 
lv1 varchar(4000); 
lv2 varchar(4000); 
lv3 varchar(4000); 
lv4 varchar(4000); 
lv5 varchar(4000); 
lv_value varchar(1000); 
lv_str_cnt integer; 
lv_ret_string VARCHAR(1000); 

BEGIN 
    v_sql := 'SELECT * from test;'; 

    FOR c1 IN EXECUTE v_sql 
    LOOP 
      IF lv_str_cnt = 0 THEN 
       lv_ret_string := '''' || c1.col1 || ''''; 
      ELSE IF lv_str_cnt IS NULL THEN 
       lv_ret_string := NULL; 
      ELSE 
       lv_ret_string := '''' || c1.col2 || ''''; 
      END IF; 
      ............. 
      ............. 

     lv_sql := lv_sql || lv1 || lv2 || lv3 || lv4; 

     EXECUTE IMMEDIATE lv_sql; 

    END LOOP; 

END; 
END_PROC; 
0

你是在正確的軌道上,但我可以看到VARCHAR2()中的至少一提的是:你的聲明的最後一個:

lv_ret_string VARCHAR2(1000); 
+0

感謝@Lars指出。我錯了,我錯過了它,但它是相同的錯誤,即使將其更改爲Varchar後。任何建議請 – Venkat

+0

任何與光標循環請 – Venkat