2016-06-03 4 views
2

Заявление, о котором идет речь, работает на Coldfusion 11 с hotfix 7 и работает на сервере Linux, который подключен к Windows Oracle database. Цель состоит в том, чтобы приложение запускалось на Linux, что является поэтапным процессом (поэтому база данных находится по адресу Windows server).sid не возвращается cfprocparam, который подключен к базе данных оракулов

Я знаю, что база данных работает, потому что он подключается успешно через панель Coldfusion администратора и это SQL оператор возвращает user_id успешно:

<cfquery name="qUser" datasource="#Application.datasource#"> 
    SELECT td_user_id 
     FROM td_user 
     WHERE ROWNUM <= 1 
</cfquery> 

Код в вопросе такова:

<cfstoredproc procedure="td_session_pkg.new_session" datasource="#application.datasource#"> 
    <cfprocparam type="In" cfsqltype="CF_SQL_CHAR" value="#arguments.username#"> 
    <cfprocparam type="In" cfsqltype="CF_SQL_CHAR" value="#arguments.password#"> 
    <cfprocparam type="In" cfsqltype="CF_SQL_CHAR" value="#cgi.remote_addr#"> 
    <cfprocparam type="In" cfsqltype="CF_SQL_INTEGER" value="#rand_int#"> 
    <cfprocparam type="In" cfsqltype="CF_SQL_INTEGER" value="#application.app_id#"> 
    <cfprocparam type="In" cfsqltype="CF_SQL_INTEGER" value="1"> 
    <cfprocparam type="In" cfsqltype="CF_SQL_INTEGER" value="#pwdRequired#"> 
    <cfprocparam type="Out" cfsqltype="CF_SQL_CHAR" variable="sid"> 
</cfstoredproc> 

<!--- Test ---> 
<cfquery name="testS" datasource="#Application.datasource#"> 
     SELECT 
      sys_context('USERENV','SID') AS theSid 
      FROM dual 
</cfquery> 
<cfthrow message="SID: #sid# and #testS.theSid#"> 

cfthrow возвращается

SID: (пусто здесь) и 37

Я пытался много вещей, но до сих пор вернуть sid правильно (это необходимо для продолжения аутентификации пользователя). Значения внутри тегов cfprocparam представляют собой переменные, указанные выше, и все имеют допустимые значения.

  • ColdFusion переменные не чувствительны к регистру, как заявлено Adobe

Любое понимание, почему это не было бы вернуть sid и почему SQL заявление будет? (из моих исследований я считаю, что они одно и то же).

Спасибо за помощь, я буду быстро отвечать на любые вопросы.

+1

Начать с правильной процедуры, если вы передаете те же параметры внутри Oracle? Используя SQL/Plus или SQL Developer, вы можете подключиться к БД и запустить что-то вроде 'SET SERVEROUTPUT ON; DECLARE sid VARCHAR2 (20); BEGIN td_session_pkg.new_session ('username', 'password', 'remote_addr', 0, 0, 1, 0, sid); DBMS_OUTPUT.PUT_LINE ('SID' || sid); КОНЕЦ;/'(с соответствующими значениями). Проверьте, что функция выполняет то, что вы ожидаете, и это не проблема с процедурой. – MT0

+0

Я только что запустил это, выполнил тестовый запрос и связал его. Затем попытался код, который вы предоставили с замещенными значениями, и получил: 'Отчет об ошибке - ORA-06550: строка 1, столбец 35: PLS-00201: идентификатор 'SID' должен быть объявлен ORA-06550: строка 1, столбец 7: PL/SQL: Statement ignored' – theblindprophet

ответ

3

Поскольку код, который я писал в комментариях, имеет бело-пространство искореженных:

SET SERVEROUTPUT ON; 

DECLARE 
    sid VARCHAR2(20); 
BEGIN 
    td_session_pkg.new_session(
    'username', 
    'password', 
    'remote_addr', 
    0, 
    0, 
    1, 
    0, 
    sid 
); 
    DBMS_OUTPUT.PUT_LINE('SID' || sid); 
END; 
/

Выполнить это в SQL клиента (то есть разработчик SQL или SQL/Plus) от пользователя вы бы подключиться через ColdFusion.

Цель состоит в том, чтобы проверить, что в базе данных:

  1. Имеет процедуру.
  2. Пользователь базы данных имеет к нему доступ.
  3. Процедура запускается в базе данных.
  4. Процедура дает ожидаемый результат.

Выполнение запроса успешно сообщит вам, что # 1- # 3 в порядке, и вы можете проверить № 4 на свои ожидания.

Если какой-либо из них не соответствует ожиданиям, то вы знаете, проблема в конце базы данных, а не в ColdFusion.

Если они работают должным образом, вы можете начать просмотр настроек CF, чтобы убедиться, что ваши источники данных указывают, где вы ожидаете (т. Е. Подключаются ли они к правильному пользователю) и что у источника данных есть разрешения для выполнения процедур.

Тогда, если это все правильно, посмотрите на переменные, которые вы передаете в теги <CFSTOREDPROC> и <CFPROCPARAM> - являются источником данных и переменными, как ожидалось.

Если вы хотите его формализовать, то вы можете написать блок интеграции &, который охватывает шаги, которые вы пытаетесь выполнить, и в следующий раз, когда вы хотите проверить, что вы просто запускаете тестовые комплекты.

+0

Я переключил sid на первый параметр и работал в SQL Developer. Потом сделал то же самое в Coldfusion, и он, наконец, работал, не знаю, почему сейчас, а не раньше. Спасибо за помощь. – theblindprophet

Смежные вопросы