繁体   English   中英

PHP PDO Oracle调用存储功能

[英]PHP PDO Oracle call stored function

我的Oracle数据库中有一个存储的函数,该函数返回一个表(类型)。 在SQL Developer中运行它时,它可以很好地工作,但我无法使其在带有PDO的PHP中工作。

这是我的存储函数:

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

这是我收到的错误消息

致命错误:消息为'SQLSTATE [HY000]的未捕获异常'PDOException':一般错误:22814 OCIStmtExecute:ORA-22814:属性或元素值大于类型ORA-06512中指定的值:在“ EPCOS.F_AKTUELLE_MENUES”,第6行( ext \\ pdo_oci \\ oci_statement.c:148)'在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中抛出

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

好的, 解决我的问题的方法很奇怪,我已经设法自己解决了。

我的类型的定义如下:

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,然后代码运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM