2015-06-03 125 views
0

我有以下查詢:簡單的SELECT語句

create or replace PROCEDURE SP_GetRegions 
(
pRegionID IN REGIONS.REGION_ID%TYPE, 
pCountry OUT COUNTRIES.COUNTRY_NAME%TYPE, 
pRegion OUT REGIONS.REGION_NAME%TYPE 
) 
IS 

BEGIN 

    SELECT c.Country_Name, 
     r.Region_Name 

    INTO pCountry, 
     pRegion  
    FROM COUNTRIES c 
    INNER JOIN REGIONS r 
    ON r.REGION_ID = c.REGION_ID 
    WHERE r.REGION_ID = pRegionID 
    ; 



END SP_GetRegions; 

我試圖用下面的命令來執行:

EXECUTE sp_getregions (1); 

而且我檢索了以下錯誤:

Error starting at line : 1 in command - 
EXECUTE sp_getregions (1) 
Error report - 
ORA-06550: line 1, column 7: 
PLS-00306: wrong number or types of arguments in call to 'SP_GETREGIONS' 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 
+1

您已經使用三個參數定義了過程,但只用一個參數調用它。你認爲'pCountry'和'pRegion'會在哪裏返回? – mustaccio

+0

列c.Country_Name,r.Region_Name? – giantLincecum

+0

這是我在進程內的最後一個版本: 創建或替換PROCEDURE SP_GetRegions ( pRegionID IN REGIONS.REGION_ID%TYPE ) IS BEGIN SELECT c.Country_Name, r.Region_Name 各國Ç INNER JOIN REGIONS r ON r.REGION_ID = c.REGION_ID WHERE r。REGION_ID = pRegionID ; END SP_GetRegions; 但我檢索到這個錯誤:錯誤(9,3):PLS-00428:INTO子句預計在這個SELECT語句,我不知道爲什麼D: – giantLincecum

回答

1

正如@mustaccio說,你調用一個過程有三個參數,但只有通過一個在您需要通過外部用於填充OUT參數的定義變量。

既然你似乎可以用SQL * Plus或SQL Developer,您可以創建一個variable命令客戶端綁定變量,並通過這些,然後打印它們的值:

variable lCountry varchar2(30); 
variable lRegion varchar2(30); 
execute sp_getregions (1, :lCountry, :lRegion); 
print lCountry 
print lRegion 

這只是真的是有用的測試程序。你會更容易定義PL/SQL變量,從塊或其他程序等調用過程:

declare 
    lCountry COUNTRIES.COUNTRY_NAME%TYPE; 
    lRegion REGIONS.REGION_NAME%TYPE; 
begin 
    sp_getregions (1, lCountry, lRegion); 
    -- do something with the local variables 
end; 
/

但是,你的程序只會在有一個國家的工作地區。如果該地區沒有國家(這不太可能),那麼你會得到一個沒有數據發現的例外;如果該地區有多個國家(很有可能),你會得到一個太多的例外。 The select ... into construct必須得到結果集中的一行數據。

因爲它要如何使用或消費返回的數據,如果你確實需要一個返回REF遊標,或a collection一個功能我不能告訴不明顯。

使用OUT REF遊標的基本程序是:

create or replace PROCEDURE SP_GetRegions 
(
    pRegionID IN REGIONS.REGION_ID%TYPE, 
    pCursor OUT SYS_REFCURSOR 
) 
IS 
BEGIN 

    OPEN pCursor FOR 
    SELECT c.Country_Name, 
      r.Region_Name 
    FROM COUNTRIES c 
    INNER JOIN REGIONS r 
    ON r.REGION_ID = c.REGION_ID 
    WHERE r.REGION_ID = pRegionID 
    ; 

END SP_GetRegions; 
/

然後你可以調用,使用綁定變量並打印結果:

variable lCursor refcursor; 
exec SP_GetRegions(1, :lCursor); 
print lCursor; 

這將是更常見到使用函數:

drop PROCEDURE SP_GetRegions; 
create or replace FUNCTION SP_GetRegions 
(
    pRegionID IN REGIONS.REGION_ID%TYPE 
) 
RETURN SYS_REFCURSOR 
IS 
    lCursor SYS_REFCURSOR; 
BEGIN 

    OPEN lCursor FOR 
    SELECT c.Country_Name, 
      r.Region_Name 
    FROM COUNTRIES c 
    INNER JOIN REGIONS r 
    ON r.REGION_ID = c.REGION_ID 
    WHERE r.REGION_ID = pRegionID 
    ; 

    RETURN lCursor; 
END SP_GetRegions; 
/

您可以從PL/SQL或普通SQL中調用它:

select SP_GetRegions(1) from dual; 

COUNTRY_NAME        REGION_NAME    
---------------------------------------- ------------------------- 
Belgium         Europe      
Switzerland        Europe      
Germany         Europe      
Denmark         Europe      
France         Europe      
Italy         Europe      
Netherlands        Europe      
United Kingdom       Europe      
+0

我只是想執行這個查詢到存儲過程..我該怎麼做:): 'SELECT c.Country_Name, r.Region_Name 從各國ç INNER JOIN區R ON r.REGION_ID = c.REGION_ID WHERE r.REGION_ID = 2' 使用pRegionID作爲where子句中的過濾器,這就是全部:),它可能像T-SQL或不是?這是我的問題... :)問候。 – giantLincecum

+0

@CarlosAlejandrodelosReyes - 你想對查詢結果做什麼?他們必須去某個地方。假設您確實需要在某個過程中執行此操作,並且您不僅需要在客戶端中執行簡單的SQL查詢,而且根本不需要PL/SQL。 –

+0

我只想查看檢索到的數據,我的意思是結果集,即所有:),但是通過存儲過程。 – giantLincecum