【问题标题】:PHP PDO Oracle call stored functionPHP PDO Oracle 调用存储函数
【发布时间】:2017-05-16 18:04:12
【问题描述】:

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

这是我收到的错误消息

致命错误:带有消息的未捕获异常“PDOException” 'SQLSTATE [HY000]:一般错误: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 中抛出

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

【问题讨论】:

  • stackoverflow.com/questions/12287875/… 查看此内容,看看是否有帮助。
  • 感谢您的回答。我以前看到过,但是我无法将 SQL 代码更改为管道语句。但是,我设法自己解决了。

标签: php oracle function pdo


【解决方案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 调用 exact same function 时,我们会得到 'FRI' 表示 Friday back,它有 3 个字符长,对于我们的 " Wochentag”专栏。

所以,我唯一需要更改的是 Wochentag 列的大小从 2 变为 3 并且代码运行。

【讨论】:

  • 哇,太丑了,很难找到。好收获!
  • 哈哈,是的。我发现这个解决方案只是一个巧合。
猜你喜欢
  • 2017-08-09
  • 2014-06-05
  • 1970-01-01
  • 2019-05-11
  • 2014-09-07
  • 2019-10-14
  • 2017-05-21
  • 2012-03-07
  • 2011-12-05
相关资源
最近更新 更多