Как мне вызвать функцию ORACLE из OCI? - PullRequest
1 голос
/ 26 февраля 2009

Я могу вызвать хранимую процедуру ORACLE через OCI в программе на C, создав команду SQL для этой команды, вот небольшой фрагмент моего кода:

      /* build sql statement calling stored procedure */
      strcpy ( sql_stmt, "call get_tab_info(:x)" );
      rc = OCIStmtPrepare(p_sql, p_err, sql_stmt,
          (ub4) strlen (sql_stmt), (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);

Но как мне создать вызов (в моей C-программе) для функции ORACLE со следующей сигнатурой:

      CREATE OR REPLACE FUNCTION get_seq_number (p_table_name IN VARCHAR2, p_seq_type IN VARCHAR2) 
      RETURN NUMBER IS

Для вызова функции в PL / SQL я бы использовал, например:

      v_seq := get_seq_number(v_tabname, v_seqtype);

Как мне построить массив символов SQL (sql_stmt) для вызова функции ORACLE в моей программе на C?

Ответы [ 2 ]

6 голосов
/ 26 февраля 2009

Создайте свой SQL-запрос следующим образом

strcpy ( sql_stmt, "BEGIN :v_seq := get_seq_number(:v_tabname, :v_seqtype); END;" );

Подготовьте ваше заявление, как и ранее. Привязать переменные по имени (включая v_seq, как и в предыдущем коде в вашем коде, и выполнить инструкцию. После завершения процедуры значение: v_seq будет установлено правильно.

1 голос
/ 26 февраля 2009

Вы либо выдаете:

SELECT my_udf()
FROM dual

и проанализируйте результат, как в SELECT query, или вызовите анонимный блок:

BEGIN
   :test := my_udf();
END;

и bind :test в качестве выходного параметра.

...