Я новичок в 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)
Что я делаю неправильно?
Сам код хорош, я думаю.
Но настройка вашего пакета может быть проблемой.
CREATE OR REPLACE PACKAGE BODY NameIt AS
PROCEDURE AddOne()
AS
BEGIN
BEGIN
# Insert into table.
EXCEPTION
# What if the value is already inserted?
END;
END;
PROCEDURE AddTwo()
AS
BEGIN
BEGIN
# Insert into table.
EXCEPTION
# What if the value is already inserted?
END;
END;
END;
/
Ответ пришел из комментария @ Wolf
Вам либо нужно подключиться как пользователь, которому принадлежит этот пакет, либо
предоставить выполнение на SURVEY_TESTER для your_connection_user ;. Поскольку
по умолчанию компилируется как authid current_user, вам также нужно предоставить
базовые объекты (таблицы, представления и т. д.) к другому соединению
пользователь.