PHP PDO Oracle调用存储函数

时间:2017-01-02 16:15:31

标签: php oracle function pdo

我的Oracle数据库中有一个存储函数,它返回一个表(类型)。在SQL Developer中运行时,它运行得很好,但我不能让它在PHP中使用PDO。

这是我存储的功能:

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());

这是我收到的错误消息

  

致命错误:带有消息的未捕获异常'PDOException'   'SQLSTATE [HY000]:一般错误:22814 OCIStmtExecute:ORA-22814:   属性或元素值大于ORA-06512类型中指定的值:   在“EPCOS.F_AKTUELLE_MENUES”第6行   (ext \ pdo_oci \ oci_statement.c:148)'in   C:\ xampp \ htdocs \ epcos \ home.php:70堆栈跟踪:#0   C:\ xampp \ htdocs \ epcos \ home.php(70):PDOStatement-> execute()#1 {main}   在第70行的C:\ xampp \ htdocs \ epcos \ home.php中抛出

我希望有人可以帮助我:)。

1 个答案:

答案 0 :(得分: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,代码运行。