Невозможно отобразить данные, возвращенные функцией sql в ColdFusion - PullRequest
0 голосов
/ 14 июля 2011

Мы пытаемся отобразить набор записей в веб-форме, используя функцию в ColdFusion.Но мы не можем отобразить выход. Мы просто получаем одно значение (последнее значение в наборе записей). Функция sql возвращает ref cursor. Пожалуйста, помогите нам решить эту проблему!спасибо!

<cfset bare_drive_result = functionname('x','y')> 

<cffunction name="functionname" hint="Gets all customer from the database" returntype="query"> 
    <cfargument name="sPcwQua" type=any>
    <cfargument name="sPcwAcc" type=any>

    <cfquery name="getRkBareDrive" datasource= "#PCW_dsn#"> 
       select pacakagename.functionname('#sPcwQua#','#sPcwAcc#')  bare_drive_result
       from dual
    </cfquery>

    <cfreturn getRkBareDrive> 
</cffunction> 

<cfoutput>#getRkBareDrive.bare_drive_result#</cfoutput> 

Ответы [ 4 ]

4 голосов
/ 14 июля 2011

У вас есть проблема с областью действия. Имя запроса внутри вашего метода - getRKBareDrive, однако вы устанавливаете результат вызова этой функции на другое имя переменной - bare_drive_result.

Код на самом деле будет:

<cfoutput query="bare_drive_result">#bare_drive_result.bare_drive_result</cfoutput>

А внутри вашей функции вам нужно добавить эту строку сразу после тегов cfargument:

<cfset var getRkBareDrive = "" />

Однако это не решает вашу непосредственную проблему. Вы пытались сделать:

<cfdump var="#bare_drive_result#" /> 

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

2 голосов
/ 15 июля 2011

Все, что @Scott Stroz сказал в своем ответе, является правдой - 1) вы путаете имена переменных между кодом и встроенной функцией, 2) используете область видимости var, чтобы определить переменную getRKBareDrive внутри вашей функции (не являющуюся частью проблемы) будучи встроенной функцией, но хорошей практикой), и 3) попробуйте CFDUMP результат вместо CFOUTPUT. Однако я не верю, что основная проблема решена, и эта часть вашего вопроса:

Функция sql возвращает курсор ref

Итак, одна вопиющая проблема в том, что вы возвращаете REFCURSOR не простое значение, поэтому вы не можете просто CFOUTPUT его, а вместо этого должны предпринять определенные шаги, чтобы ColdFusion знал, что это набор запросов. REFCURSOR может быть возвращен в вызовах из хранимых процедур через CFPROCRESULT (или через CFPROCPARAM type = "OUT" CFSQLType = "CF_SQL_REFCURSOR", если это возвращаемый параметр, а не результат).

Итак ... попробуйте покрыть вызов CFQUERY для CFSTOREDPROC. Вот пример кода , который предполагает, что вы можете вызывать свой пакет / функцию напрямую как сохраненный процесс по сравнению с запросом . Я удалил встроенную функцию, так как она добавляет здесь слишком много сложности (снова см. Ответ Скотта) - просто попробуйте голый код как способ заставить вызов работать.

<cfstoredproc procedure="pacakagename.functionname" datasource= "#PCW_dsn#">
    <cfprocparam type="IN" CFSQLType="CF_SQL_VARCHAR", value="x">    
    <cfprocparam type="IN" CFSQLType="CF_SQL_VARCHAR", value="y">    
    <cfprocresult name="bare_drive_result" >
</cfstoredproc> 
<cfdump var="#bare_drive_result#">

Если вы видите результаты в дампе, вы сможете заменить дамп и вывести поля внутри курсора ref точно так же, как обычный результат CFQUERY в вызове CFOUTPUT query = "bare_drive_result".

Из Документация CF8 по CFPROCRESULT :

CFML поддерживает тип ссылочного курсора Oracle 8 и 9, который передает параметр по ссылке. Параметры, которые передаются таким образом, могут быть выделяется и освобождается из памяти при выполнении одного приложение. Использовать ссылочные курсоры в пакетах или хранимых процедуры, используйте тег cfprocresult. Это вызывает ColdFusion JDBC драйвер базы данных для помещения курсоров ссылок Oracle в набор результатов. (Вы не можете использовать этот метод с драйверами Oracle ThinClient JDBC.)

0 голосов
/ 14 июля 2011

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

<cfquery name="getRkBareDrive" datasource= "#PCW_dsn#" result="qryname"> 

затем дампчто:

<cfdump var="#qryname#" />

В возвращенной структуре должен быть показан переданный запрос, количество результатов и т. д. [я подозреваю, что на самом деле он возвращает только один], полное описание см. здесь: http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_p-q_17.html

0 голосов
/ 14 июля 2011

Попробуйте это

<cfoutput query="getRkBareDrive">#getRkBareDrive.bare_drive_result#</cfoutput> 
...