2017-01-02 41 views
0

我在我的Oracle數據庫中有一個存儲函數,它返回一個表(類型)。在SQL Developer中運行它時,它工作得很好,但我無法使用PDO在PHP中工作。PHP PDO Oracle調用存儲函數

這裏是我的存儲功能:

CREATE OR REPLACE FUNCTION f_aktuelle_Menues (p_week INTEGER) 
    RETURN TableforAktuelleMenues 
IS 
    v_week INTEGER := p_week; 
    v_table TableforAktuelleMenues; 
BEGIN 
    SELECT CAST(
      MULTISET(
       SELECT tm.MenueID "ID", men.Bezeichnung "Menuebezeichnung", men.Preis "Preis", TO_CHAR(tm.Datum, 'DY') "Tag" 
        FROM Tagesmenue tm INNER JOIN Menue men ON(tm.MenueID = men.MenueID) 
        WHERE TO_NUMBER(TO_CHAR(tm.Datum, 'WW')) = (TO_NUMBER(TO_CHAR(SYSDATE, 'WW')) + TO_NUMBER(v_week)) 
      ) AS TableforAktuelleMenues) 
      INTO v_table 
      FROM dual; 
    RETURN v_table; 
    COMMIT; 
END; 

下面是表類型:

CREATE OR REPLACE 
TYPE TableforAktuelleMenues AS TABLE OF TypeAktuellesMenue; 

......這裏是另一種類型:

CREATE OR REPLACE 
TYPE TypeAktuellesMenue 
AS OBJECT 
(
    MenueId INTEGER, 
    Bezeichnung VARCHAR2(45), 
    Preis FLOAT, 
    Wochentag VARCHAR(2) 
); 

所以,就像我上面提到的,該功能在SQL開發人員具有以下查詢調用時,它工作得很好:

SELECT * FROM table(f_aktuelle_Menues(0)); 

...但它不PHP和PDO工作用下面的代碼:

$query = $conn->prepare("SELECT * FROM table(f_aktuelle_Menues(0))"); 
$query->execute(); 
print_r($query->fetchAll()); 

這是錯誤信息我得到:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 22814 OCIStmtExecute: ORA-22814: attribute or element value is larger than specified in type ORA-06512: at "EPCOS.F_AKTUELLE_MENUES", line 6 (ext\pdo_oci\oci_statement.c:148)' in C:\xampp\htdocs\epcos\home.php:70 Stack trace: #0 C:\xampp\htdocs\epcos\home.php(70): PDOStatement->execute() #1 {main} thrown in C:\xampp\htdocs\epcos\home.php on line 70

我希望有人能幫助我:)

+0

http://stackoverflow.com/questions/12287875/oracle-sql-ora-22814-attribute-or-element-value-is-larger-than-specified-in-type回顧一下,看看它是否有幫助。 –

+0

感謝您的回答。我之前看到過,但我不能將SQL代碼更改爲管道語句。但是,我自己設法解決了這個問題。 – Stjubit

回答

1

好了,該解決我的問題很奇怪,我已經成功由我自己來解決它。

我喜歡的類型的定義是這樣的:

CREATE OR REPLACE 
TYPE TypeAktuellesMenue 
AS OBJECT 
(
    MenueId INTEGER, 
    Bezeichnung VARCHAR2(45), 
    Preis FLOAT, 
    Wochentag VARCHAR(2) 
); 

因此,列 「Wochentag」 的大小爲2,這就是問題所在。

在的SQLDeveloper,下面的函數返回 'FR' 星期五:

TO_CHAR(some_date, 'DY') 

...但與PDO調用完全相同的功能的時候,我們得到 'FRI'星期五回來,這是3個字符長,太大,我們的「Wochentag」列。

所以,我唯一需要改變的是Wochentag列的大小從2到3,代碼運行。

+0

哇,這是醜陋的,很難找到。接得好! –

+0

哈哈,是的。我發現這個解決方案只是一個巧合。 – Stjubit