2013-12-20 68 views
1

我是Oracle存儲過程的新手。我寫了下面的存儲過程並給出結果。Oracle傳遞表變量

我相信表變量和參數變量或者是同名的。如何在不改變變量names.O處理這種情況

CREATE OR REPLACE PROCEDURE procedval (Code IN varchar(50),Id1 OUT INTE) 
AS 
BEGIN 

Id1 := 0; 

SELECT Id1 INTO id1 
FROM tabl1 
WHERE Code = Code; 

END; 
+0

嘗試使用 「ID1」 的列名(與雙引號) – Sebas

+0

是什麼一個「INTE?「另外,沒有參數的大小聲明(除非使用子類型),所以刪除」(50)「不要將參數命名爲與列相同的參數。嘗試使用前綴,例如P_Code,P_Id1等。 – OldProgrammer

回答

0

試試這個:

with t as 
    (SELECT Id1 as New_Id1, Code as New_code) 
    FROM tabl1) 
select New_Id1 into Id1 
from t 
WHERE New_code = Code; 

另一種解決方案是這樣的一個:

execute immediate 'select Id1 from tabl1 where Code = :b' into Id1 using Code; 
1

嘗試SELECT tabl1.Id1 INTO Id1...

0

你不能爲此做任何事情,這就是制定標準的原因,對於變量聲明。它 之一,一個PL/SQL變量應與l_(本地)或g_(全局)

數據庫與判斷歧義操作數(左或右)中的哪個一個分貝柱或可變結束前綴。

另外添加一些更多的光線,在查詢中使用的任何變量,將被視爲一個bind variable implicitly.

0

的一些問題:

  1. VARCHAR datatype should not be usedVARCHAR2應在其場所使用 - VARCHAR是目前與VARCHAR2同義,但是與不同的比較語義相比,VARCHAR數據類型被調度爲重新定義爲用於可變長度字符串的單獨數據類型(即,對於VARCHAR2空字符串相當於NULL值,但當VARCHAR被重新定義時,則空的VARCHAR將不等於NULL)。
  2. 您沒有在過程的標頭中指定數據類型的大小 - 所以如果您要將輸入聲明爲已命名的數據類型,那麼您只需使用VARCHAR2而不是VARCHAR(50)
    • 您可以改爲參考表格列的%TYPE - 如tabl1.code%TYPEtabl1.id1%TYPE
  3. 你不需要初始化Id1 - 這將由SELECT語句完成(如果需要異常處理程序,則可以根據需要在那裏定義它)。
  4. 你應該有一個異常處理程序。

喜歡的東西:

SQL Fiddle

的Oracle 11g R2架構設置

CREATE TYPE INTE IS OBJECT(x NUMBER(3), y NUMBER(3)) 
/

CREATE TABLE tabl1 (
    code VARCHAR2(50), 
    id1 INTE 
) 
/

INSERT INTO tabl1 VALUES ('a', INTE(3, 4)) 
/

CREATE OR REPLACE PROCEDURE procedval (
    code IN tabl1.code%TYPE, 
    Id1 OUT tabl1.id1%TYPE 
) 
AS 
BEGIN 
    SELECT t.Id1 
    INTO Id1 
    FROM tabl1 t 
    WHERE t.Code = code; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    Id1 := NULL; 
END; 
/