2012-10-30 68 views
-1

我得到200供應商名稱作爲輸入參數與存儲過程的巨大價值。我嘗試在CLOB,VARCHAR2(32767)聲明。但是當我嘗試執行它不接受。 請任何人都幫我如何處理這個問題。如何處理大字符串作爲輸入參數傳遞給過程?

CREATE OR REPLACE PROCEDURE GMMT_PROC.or_rmce_RB_grid_sp (
    p_plant_cd  IN VARCHAR2, 
    p_region_cd  IN VARCHAR2, 
    p_matrl_nbr  IN OUT VARCHAR2, 
    p_supplier_nbr IN OUT VARCHAR2, 
    p_supplier_name IN OUT CLOB, 
    p_mrpcontrollercd IN OUT VARCHAR2, 
    p_currency  IN VARCHAR2, 
    oresultset  OUT sys_refcursor, 
    p_err_cd   OUT NUMBER, 
    p_err_msg   OUT VARCHAR2 
) 
IS 
sqlquery varchar2(10000); 
p1 varchar2(10); 
p2 varchar2(20); 
p3 varchar2(20); 
p4 varchar2(20); 
v_percent varchar2(10):='%'; 
V_FROM_CURRENCY VARCHAR2(5); 
V_EX_RATE NUMBER; 
v_matrl_nbr  VARCHAR2(10000); 
v_supplier_nbr VARCHAR2(10000); 
v_supplier_name CLOB; 
v_mrpcontrollercd VARCHAR2(10000); 

BEGIN 
p1:='matrl_nbr'; 
v_matrl_nbr:=p_matrl_nbr; 
p2:='supplier_nbr'; 
v_supplier_nbr :=p_supplier_nbr; 
p3:='supplier_name_txt'; 
v_supplier_name :=p_supplier_name; 
p4:='mrp_controller_cd'; 
v_mrpcontrollercd:=p_mrpcontrollercd; 
sqlquery:='select wk_nbr, nbr_working_days,'||p1||' as matrl_nbr ,'||p2||' as supplier_nbr,'||p3||' as supplier_name_txt,'||p4||' as mrp_controller_cd,sum(reqmnt_qty)reqmnt_qty , sum(proj_inven_qty)proj_inven_qty, sum(doh) doh,sum(proj_recpt_1) proj_recpt_1, sum(proj_recpt_2) proj_recpt_2, sum(proj_recpt_3) proj_recpt_3, sum(proj_recpt_4) proj_recpt_4,sum(proj_recpt_total_qty) proj_recpt_total_qty,sum(consumption_qty) consumption_qty, sum(consumption_var_qty) consumption_var_qty , sum(final_recpt_qty) final_recpt_qty,sum(recpt_var_qty) recpt_var_qty from GMMT_OWNER.OR_RMCE_GTT_PROJ_RECPT_T '; 
sqlquery:=sqlquery||' where ('''||v_matrl_nbr||''' IS NULL) OR matrl_nbr IN (SELECT * FROM TABLE(GMMT_PROC.OR_in_list_RPT5_FN('''||v_matrl_nbr||'''))) OR matrl_nbr like '''|| v_matrl_nbr||v_percent||''''; 
sqlquery:=sqlquery||' AND ('''||v_supplier_nbr||''' IS NULL) OR supplier_nbr IN (SELECT * FROM TABLE(GMMT_PROC.OR_in_list_RPT5_FN('''||v_supplier_nbr||'''))) OR supplier_nbr like '''|| v_supplier_nbr||v_percent||''''; 
sqlquery:=sqlquery||' AND ('''||v_supplier_name||''' IS NULL) OR supplier_name_txt IN (SELECT * FROM TABLE(GMMT_PROC.OR_in_list_RPT5_FN('''||v_supplier_name||'''))) OR supplier_name_txt like '''|| v_supplier_name||v_percent||''''; 
sqlquery:=sqlquery||' AND ('''||v_mrpcontrollercd||''' IS NULL) OR mrp_controller_cd IN (SELECT * FROM TABLE(GMMT_PROC.OR_in_list_RPT5_FN('''||v_mrpcontrollercd||'''))) OR mrp_controller_cd like '''|| v_mrpcontrollercd||v_percent||''''; 
sqlquery:=sqlquery||' group by wk_nbr, nbr_working_days,'||p1||','||p2||','||p3||','||p4||' order by wk_nbr'; 

OPEN oresultset FOR sqlquery; 

dbms_output.put_line(sqlquery); 
END;     
+3

聲明CLOB應該工作,什麼樣的錯誤你得到 – Maddy

+0

我想要打印這是越來越作爲輸入供應商名稱我得到的語句句柄沒有執行。 –

+3

郵編和錯誤消息(CLOB版本) – bpgergo

回答

1

您需要了解綁定變量!從來沒有,有史以來連接值傳遞到SQL語句。

請參閱http://docs.oracle.com/cd/E14072_01/appdev.112/e10472/dynamic.htm#CHDFCHHJ爲什麼這是一個壞主意。

現在,您遇到的問題是由於插入到SQL語句中的值太大,導致很長的字符串 - 對於varchar太長。

請參閱http://docs.oracle.com/cd/E14072_01/appdev.112/e10472/dynamic.htm#BJEDAHEE瞭解如何將綁定變量與來自PL/SQL的動態SQL結合使用。

+0

嗨可以ü請告訴我如何解決這個問題。我增加了Sqlquery的大小後,它給ORA-00604:在遞歸SQL級別發生錯誤1 ORA-01003:沒有語句解析..我din knw其他選項比這個所以我用這個。你能告訴我,我能爲此做些什麼 –

+0

閱讀我答案的最後一個鏈接!它描述瞭如何使用綁定變量來解決你所有的問題。 –

1

動態SQL:不要這樣做。

您絕對不應永遠將包含值的變量連接到SQL。 Never, please它殺死了性能,難以重現/發現錯誤,並且公然開放給SQL注入。

可以使用動態SQL進行動態分組,因爲P1 ... P4不是值,而是列名,因此不能綁定。

ALL other variables should be passed as binds

您的OPEN語句應該是:

​​

爲了防止用戶濫用這一動態SQL塊,你必須確保P1 ...-P4從預先覈准清單,或按上述方法使用DBMS_ASSERT

在實踐中,如果該列表是小,你可以使用簡單的靜態SQL:

OPEN cc FOR 
    SELECT wk_nbr, 
      nbr_working_days, 
      decode(p1, 'column1', column1, 'column2', column2 [...]) AS matrl_nbr, 
      [...] 
    GROUP BY [...] 
       decode(p1, 'column1', column1, 'column2', column2 [...]), 
       [...]; 
相關問題