Процедура:идентификатор oci_execute должен быть объявлен ORA-06550
FUNCTION f_exists (
p_pidm gobansr.gobansr_pidm%TYPE,
p_num gobansr.gobansr_num%TYPE,
p_rowid gb_common.internal_record_id_type DEFAULT NULL)
RETURN VARCHAR2 IS
--
TYPE queryone_ref IS REF CURSOR;
lv_cursor queryone_ref;
lv_tempout VARCHAR2(1) := 'N';
BEGIN
--
-- Assign the cursor variable to the appropriate cursor
--
IF p_rowid IS NOT NULL THEN
OPEN lv_cursor for
SELECT 'Y'
FROM gobansr
WHERE ROWID = p_rowid;
ELSE
OPEN lv_cursor for
SELECT 'Y'
FROM gobansr
WHERE gobansr_pidm = p_pidm
AND gobansr_num = p_num;
END IF;
FETCH lv_cursor INTO lv_tempout;
CLOSE lv_cursor;
RETURN lv_tempout;
END f_exists;
PHP код для запуска/запроса хранимой процедуры:
$conn = oci_connect($username, $password, $db);
$sql = 'BEGIN "gb_pin_answer"."f_exists"(:p_pidm, :p_num); END;';
$stmt = oci_parse($conn, $sql);
if (!$conn)
exit("DB did not connect.");
$p_pidm = 36706;
$p_num = 1;
oci_bind_by_name($stmt,':p_pidm',$p_pidm,5);
oci_bind_by_name($stmt,':p_num',$p_num,1);
if (!oci_execute($stmt))
exit("Procedure Failed.");
oci_commit($conn);
oci_close($conn);
Я проверил с DBA, что у меня есть выполнить привилегии хранимая процедура и PHP успешно соединяются с сервером базы данных.
возвращает эту ошибку:
Message: oci_execute(): ORA-06550: line 1, column 8: PLS-00201: identifier 'gb_pin_answer.f_exists' must be declared ORA-06550: line 1, column 8: PL/SQL: Statement ignored
UPDATE:
я смог запустить: select gb_pin_answer.f_exists('36706','2') as RESULT from dual
и он вернулся Y
Теперь нужно выяснить, как идти об использовании этой хранимой процедура в моем php:
PROCEDURE p_create(
p_pidm gobansr.gobansr_pidm%TYPE,
p_num gobansr.gobansr_num%TYPE,
p_gobqstn_id gobansr.gobansr_gobqstn_id%TYPE DEFAULT NULL,
p_qstn_desc gobansr.gobansr_qstn_desc%TYPE DEFAULT NULL,
p_ansr_desc gobansr.gobansr_ansr_desc%TYPE,
p_ansr_salt gobansr.gobansr_ansr_salt%TYPE,
p_user_id gobansr.gobansr_user_id%TYPE DEFAULT gb_common.f_sct_user,
p_data_origin gobansr.gobansr_data_origin%TYPE,
p_rowid_out OUT gb_common.internal_record_id_type) IS
--
lv_gobansr_rec gobansr%ROWTYPE;
error_message gb_common_strings.err_type;
lv_hashed_answer gobansr.gobansr_ansr_Desc%type;
lv_salt gobansr.gobansr_ansr_salt%type;
BEGIN
--
-- Make sure the record doesn't already exist
--
IF (gb_pin_answer.f_exists(p_pidm,p_num)='Y') THEN
error_message := gb_common_strings.f_append_error(error_message,
gb_pin_answer_strings.f_get_error('RECORD_EXISTS'));
END IF;
--
IF (error_message IS NOT NULL) THEN
RAISE_APPLICATION_ERROR(gb_common_strings.ERR_CODE, error_message);
END IF;
lv_salt := gspcrpt.F_GET_SALT(length(replace(p_ansr_desc,' ')));
gspcrpt.p_saltedhash(lower(replace(p_ansr_desc,' ')),lv_salt,lv_hashed_answer);
--
-- Execute business rules
--
gb_pin_answer_rules.p_validate(
p_pidm => p_pidm,
p_num => p_num,
p_gobqstn_id => p_gobqstn_id,
p_qstn_desc => p_qstn_desc,
p_ansr_desc => p_ansr_desc,
p_ansr_salt => lv_salt,
p_user_id => p_user_id,
p_data_origin => p_data_origin);
--
-- This is where the local user exit call, if defined, will occur.
--
/* -- No local call
p_pidm => p_pidm,
p_num => p_num,
p_gobqstn_id => p_gobqstn_id,
p_qstn_desc => p_qstn_desc,
p_ansr_desc => p_ansr_desc,
p_ansr_salt => lv_salt,
p_user_id => p_user_id,
p_data_origin => p_data_origin);
*/
--
-- Build the DML record
--
lv_gobansr_rec := f_build_gobansr_rec(
p_pidm => p_pidm,
p_num => p_num,
p_gobqstn_id => p_gobqstn_id,
p_qstn_desc => p_qstn_desc,
p_ansr_desc => lv_hashed_answer,
p_ansr_salt => lv_salt,
p_user_id => p_user_id,
p_data_origin => p_data_origin);
--
-- Set the activity date
--
lv_gobansr_rec.gobansr_activity_date := SYSDATE;
--
-- Delegate to the DML layer
--
dml_gobansr.p_insert(lv_gobansr_rec, p_rowid_out);
--
-- NOTE: Banner Messaging Support logic is only called after a
-- successful DML operation
-- Check if messaging is enabled/licensed for this business entity.
--
IF (gb_event.f_entity_publishable(gb_event.baseline_ind,
M_ENTITY_NAME)) THEN
-- Register this business entity with messaging support.
gb_pin_answer_rules.p_register_entity(
p_operation_type => gb_event.CREATE_OPERATION,
p_pidm => p_pidm,
p_num => p_num,
p_gobqstn_id => p_gobqstn_id,
p_qstn_desc => p_qstn_desc,
p_ansr_desc => p_ansr_desc,
p_ansr_salt => p_ansr_salt,
p_user_id => p_user_id,
p_data_origin => p_data_origin,
p_internal_record_id => p_rowid_out);
END IF;
END p_create;
возможность вызвать функцию из SQLPlus при входе с теми же учетными данными Вы? Кроме того, если вы вызываете функцию из SQLPlus, вам нужно сделать что-то вроде этого: 'SELECT f_exists (arg, arg) FROM DUAL'. Возможно, стоит попробовать в вашем PHP-коде вместо анонимного блока, но это всего лишь предположение. –
Я запустил его в Oracle SQL Developer как один и тот же пользователь (на маке), а выбор работает. Сначала я пытался использовать gb_pin_answer.p_create, а затем решил сделать детские шаги и начать с f_exists. Я попытался запустить его, как выбрать из двойного, и не повезло. – Brad
в вашем sql, вы вызываете f_exists с 2 параметрами varchar2, в то время как вы используете численные аргументы в коде php/oci - возможно, автоматическое преобразование завершается с ошибкой. также попробуйте вызвать f_exists из sqlplus с теми же параметрами, что и внутри вашего кода ('('36706', '1')' вместо '('36706', '2')'). – collapsar