ColdFusion - cfproc param: Как вызвать хранимую процедуру с определенной в базе данных переменной %TYPE?

У меня есть хранимая процедура в Oracle. Один из входных параметров имеет определенный тип (см. ниже). Ошибка, которую я получаю всякий раз, когда я вызываю cfstoredproc, это «выражение неправильного типа ORA-06550». Это форматированный varchar, это столбец таблицы. Нет соответствующего типа CFPROCPARAM.

Тип представляет собой формат, определяемый пакетом (столбец таблицы): EMAIL_ADDRESSES_TABLE.USER_ID%TYPE. Столбец таблицы USER_ID: USER_ID VARCHAR2 (8 BYTE)

USER_ID — это число, дополненное 0, например «00001234».

мой вызов:

<cfstoredproc procedure="PK_EMAIL.get_emails" datasource="#MYDSN#">
  <cfprocparam type="in" cfsqltype="CF_SQL_VARCHAR" variable="p_user_id" value="#formattedUserId#">
  <cfprocparam type="in" cfsqltype="CF_SQL_NUMERIC" variable="p_active_only" value="1">
  <cfprocresult name="spResult">
</cfstoredproc>

хранимая функция proc:

FUNCTION get_emails(
  p_user_id        IN EMAIL_ADDRESSES_TABLE.USER_ID%TYPE,
  p_active_only    IN SIMPLE_INTEGER
) RETURN EMAIL_ADDRESSES_TABLE;

Ошибка, которую я получаю от системы:

[Macromedia][Oracle JDBC Driver][Oracle]ORA-06550: line 1, column 18: PLS-00382: expression is of wrong type ORA-06550: line 1, column 7: PL/SQL: Statement ignored 

person Alan    schedule 08.08.2014    source источник
comment
Пожалуйста, покажите часть хранимой процедуры, которая объявляет входные параметры.   -  person Dan Bracuk    schedule 08.08.2014
comment
Я думал, что разместил все, но вот соответствующее объявление таблицы: TABLE EMAIL_ADDRESSES_TABLE ... USER_ID VARCHAR2 (8 BYTE) NOT NULL   -  person Alan    schedule 08.08.2014
comment
Не уверен насчет оракула, но с другими базами данных хранимые процедуры и функции - это разные вещи. В таком случае моя интерпретация термина хранимая функция proc заключалась в том, что ваша хранимая процедура вызывает функцию. Это было не правильно?   -  person Dan Bracuk    schedule 08.08.2014
comment
@DanBracuk - о, ага. В прошлом я вызывал много хранимых процедур. Но вы правы, это общественная функция, а не процедура. Теперь я должен выяснить, как я могу назвать это.   -  person Alan    schedule 08.08.2014
comment
Я бы предположил, что вы называете это как любую другую функцию - get_emails( userId, true)   -  person Scott Stroz    schedule 08.08.2014


Ответы (1)


@DanBracuk помог мне понять это.

Эти функции изначально были настроены для представления в виде вызовов Java API.

Краткий ответ: это «ФУНКЦИЯ», а не «ПРОЦЕДУРА». ColdFusion не может напрямую вызывать функцию БД.

Обходной путь (информация предоставлена ​​кем-то здесь, кто сделал это однажды): необходимо создать ПРОЦЕДУРУ Oracle, которая вызывает функцию. Он просто действует как посредник между CF и функцией Oracle.

person Alan    schedule 08.08.2014
comment
Я думаю, что если вы можете вызвать функцию из оператора запроса (например, из любого эквивалента Oracle SQL Server Management Studio), вы сможете вызвать ее из тега ‹cfquery›. - person Carl Von Stetten; 09.08.2014
comment
@Карл прав. SELECT myFunction() AS function_result FROM DUAL — правильный запрос от ColdFusion (при условии, что вывод правильный). - person Fish Below the Ice; 11.08.2014