【发布时间】:2015-10-30 02:14:32
【问题描述】:
我是 Oracle/PLSQL 的新手。我正在尝试编写一个包。我正在使用 Oracle SQL Developer。
在 SQL Developer 中一切看起来都很好,但是当我尝试通过 PHP/PDO 使用该包时,我得到以下信息:
警告:PDOStatement::execute() [function.PDOStatement-execute]: SQLSTATE [HY000]:一般错误:6550 OCIStmtExecute:ORA-06550:行 1,第 7 列:PLS-00201:标识符 'SURVEY_TESTER.ADD_MBN_RECORD' 必须 被声明 ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略 (/core-php-src-5.2.5/php-5.2.5/ext/pdo_oci/oci_statement.c:146) 在 /home/robert/www/prod/htdocs/intra/__SURVEY_RECORD.php 第 47 行
我的包裹声明:
CREATE OR REPLACE
PACKAGE SURVEY_TESTER AS
PROCEDURE ADD_MBN_RECORD(
iMAILMONTH IN MASTERBARCODEDNAMES14.MAILMONTH%TYPE,
iZIPGROUP IN MASTERBARCODEDNAMES14.ZIPGROUP%TYPE,
iFIRST IN MASTERBARCODEDNAMES14.FIRST%TYPE,
iLAST IN MASTERBARCODEDNAMES14.LAST%TYPE,
iADDRESS IN MASTERBARCODEDNAMES14.ADDRESS%TYPE,
iCITY IN MASTERBARCODEDNAMES14.CITY%TYPE,
iST IN MASTERBARCODEDNAMES14.ST%TYPE,
iZIP IN MASTERBARCODEDNAMES14.ZIP%TYPE,
iSFDU IN MASTERBARCODEDNAMES14.SFDU%TYPE,
iSOURCE IN MASTERBARCODEDNAMES14.SOURCE%TYPE,
iSOURCECODE IN MASTERBARCODEDNAMES14.SOURCECODE%TYPE,
iNAMEMONTHMATCH IN MASTERBARCODEDNAMES14.NAMEMONTHMATCH%TYPE,
iCOMPLETED_SURVEY IN MASTERBARCODEDNAMES14.COMPLETED_SURVEY%TYPE,
iNSCFADDR IN MASTERBARCODEDNAMES14.NSCFADDR%TYPE,
iZIPADDRAPT IN MASTERBARCODEDNAMES14.ZIPADDRAPT%TYPE
);
PROCEDURE ADD_RLI_RECORD(
iMAILMONTH IN RETAIL_LINE_ITEM.MAILMONTH%TYPE,
iSPONSORID IN RETAIL_LINE_ITEM.SPONSORID%TYPE,
iDEALERID IN RETAIL_LINE_ITEM.DEALERID%TYPE,
iZIPCODE IN RETAIL_LINE_ITEM.ZIPCODE%TYPE,
iNAMES IN RETAIL_LINE_ITEM.NAMES%TYPE,
iZIPRATE IN RETAIL_LINE_ITEM.ZIPRATE%TYPE,
iZIPTOTAL IN RETAIL_LINE_ITEM.ZIPTOTAL%TYPE,
iMAILING IN RETAIL_LINE_ITEM.MAILING%TYPE,
iCRRT IN RETAIL_LINE_ITEM.CRRT%TYPE
);
END SURVEY_TESTER;
/
我的包裹体:
CREATE OR REPLACE PACKAGE BODY SURVEY_TESTER AS
PROCEDURE ADD_MBN_RECORD(
iMAILMONTH IN MASTERBARCODEDNAMES14.MAILMONTH%TYPE,
iZIPGROUP IN MASTERBARCODEDNAMES14.ZIPGROUP%TYPE,
iFIRST IN MASTERBARCODEDNAMES14.FIRST%TYPE,
iLAST IN MASTERBARCODEDNAMES14.LAST%TYPE,
iADDRESS IN MASTERBARCODEDNAMES14.ADDRESS%TYPE,
iCITY IN MASTERBARCODEDNAMES14.CITY%TYPE,
iST IN MASTERBARCODEDNAMES14.ST%TYPE,
iZIP IN MASTERBARCODEDNAMES14.ZIP%TYPE,
iSFDU IN MASTERBARCODEDNAMES14.SFDU%TYPE,
iSOURCE IN MASTERBARCODEDNAMES14.SOURCE%TYPE,
iSOURCECODE IN MASTERBARCODEDNAMES14.SOURCECODE%TYPE,
iNAMEMONTHMATCH IN MASTERBARCODEDNAMES14.NAMEMONTHMATCH%TYPE,
iCOMPLETED_SURVEY IN MASTERBARCODEDNAMES14.COMPLETED_SURVEY%TYPE,
iNSCFADDR IN MASTERBARCODEDNAMES14.NSCFADDR%TYPE,
iZIPADDRAPT IN MASTERBARCODEDNAMES14.ZIPADDRAPT%TYPE
) IS
BEGIN
INSERT INTO MASTERBARCODEDNAMES14 (
MAILMONTH,
ZIPGROUP,
FIRST,
LAST,
ADDRESS,
CITY,
ST,
ZIP,
SFDU,
SOURCE,
SOURCECODE,
NAMEMONTHMATCH,
COMPLETED_SURVEY,
NSCFADDR,
ZIPADDRAPT
) VALUES (
iMAILMONTH,
iZIPGROUP,
iFIRST,
iLAST,
iADDRESS,
iCITY,
iST,
iZIP,
iSFDU,
iSOURCE,
iSOURCECODE,
iNAMEMONTHMATCH,
iCOMPLETED_SURVEY,
iNSCFADDR,
iZIPADDRAPT
);
END ADD_MBN_RECORD;
PROCEDURE ADD_RLI_RECORD(
iMAILMONTH IN RETAIL_LINE_ITEM.MAILMONTH%TYPE,
iSPONSORID IN RETAIL_LINE_ITEM.SPONSORID%TYPE,
iDEALERID IN RETAIL_LINE_ITEM.DEALERID%TYPE,
iZIPCODE IN RETAIL_LINE_ITEM.ZIPCODE%TYPE,
iNAMES IN RETAIL_LINE_ITEM.NAMES%TYPE,
iZIPRATE IN RETAIL_LINE_ITEM.ZIPRATE%TYPE,
iZIPTOTAL IN RETAIL_LINE_ITEM.ZIPTOTAL%TYPE,
iMAILING IN RETAIL_LINE_ITEM.MAILING%TYPE,
iCRRT IN RETAIL_LINE_ITEM.CRRT%TYPE
) IS
BEGIN
INSERT INTO RETAIL_LINE_ITEM (
MAILMONTH,
SPONSORID,
DEALERID,
ZIPCODE,
NAMES,
ZIPRATE,
ZIPTOTAL,
MAILING,
CRRT
) values (
iMAILMONTH,
iSPONSORID,
iDEALERID,
iZIPCODE,
iNAMES,
iZIPRATE,
iZIPTOTAL,
iMAILING,
iCRRT
);
END ADD_RLI_RECORD;
END SURVEY_TESTER;
/
而且,这是我的 PHP 的要点。假设生成的 SQL 没问题。
$sql = "begin SURVEY_TESTER.ADD_".$table."_RECORD(:".implode(", :", array_keys($data))."); end;";
这是一个 var_dump。以防万一。
string 'begin SURVEY_TESTER.ADD_RLI_RECORD(:mailmonth, :sponsorid, :dealerid, :zipcode, :names, :ziprate, :ziptotal, :mailing, :crrt); end;' (length=131)
array
':mailmonth' => string '0715' (length=4)
':sponsorid' => string '121266' (length=6)
':dealerid' => string 'COFL' (length=4)
':zipcode' => string '34683' (length=5)
':names' => string '100' (length=3)
':ziprate' => string '0.56' (length=4)
':ziptotal' => string '24.75' (length=5)
':mailing' => string '201507' (length=6)
':crrt' => string 'All' (length=3)
我做错了什么?
【问题讨论】:
-
您的 PDO 连接字符串是否连接到您用于编译此包的同一用户架构?
-
@Wolf 不同的用户,相同的架构。那会有什么不同吗?
-
“不同的用户,相同的架构”是什么意思?您是说从 PHP 代码打开连接后您正在执行
alter session set current_schema吗?您确定您的 PHP 应用程序用于连接的用户已获得对包的execute访问权限吗? -
是的。您要么需要以拥有此包的用户身份连接,要么需要以
grant execute on SURVEY_TESTER to <your_connection_user;连接。因为默认编译为authid current_user,您还需要将底层对象(表、视图等)授予其他连接用户。 -
@Wolf,谢谢,这正是我所需要的。如果需要,请随时发布答案,我稍后会检查。