我的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中抛出
我希望有人可以帮助我:)。
答案 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,代码运行。