2017-01-02 5 views
0

У меня есть хранимая функция в моей базе данных Oracle, которая возвращает таблицу (тип). При запуске в SQL Developer он работает отлично, но я не могу заставить его работать на PHP с PDO.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 Developer с помощью следующего запроса :

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