2010-02-01 2 views
1

Существует cffunction (в документе cfc), который аутентифицирует пользователя. Он ссылается на хранимую процедуру и имеет cfprocparam, который имеет тип «out». В справочнике Adobe CFML говорится, что это означает, что «этот параметр используется для приема данных только из системы базы данных. Этот параметр передается как связанная переменная».Что такое связанная переменная?

Что такое связанная переменная?

ответ

3

Термин «связанная переменная» может быть плохим выбором слов из Adobe. Я думаю, что они означают, что он связан с переменной внутри хранимой процедуры, а не с переменной привязки в смысле «сохранить смысл объяснения» (это должно быть верно как для переменных, так и для переменных). Есть несколько веских причин, чтобы выбрать «out» over «in», и есть также побочные эффекты, которые могут оказаться полезными или могут сжечь вас, если вы их не ожидаете.

Прежде всего, если параметр в хранимой процедуре имеет тип «in», то большинство баз данных не позволит вам назначить ему в proc - очень полезно, когда вы знаете, что переменная не должна изменяться. Вот пример Oracle ...

CREATE PROCEDURE bind_test(p_testin IN NUMBER, p_testout OUT NUMBER) IS 
BEGIN 

-- p_testin := 100; -- error can not be used as an assignment target 
p_testout := 100; 

END bind_test; 

p_testin не может быть изменен, используется только в таких местах, как «где» статьи или инициировать другие переменные, но p_testout может быть изменен.

Во-вторых, вы можете сделать это на шаг дальше, используя синтаксис cfprocparam «variable =» в режиме холодного слияния и фактически вернуть измененное значение в ColdFusion, не пройдя через cfprocresult. Обратите внимание, в этом примере начальные значения для nTypeIn и nTypeOut как начинаются в 10 ...

<cfset nTypeIn = 10 > 
<cfset nTypeOut = 10 > 

<cfstoredproc procedure = "bind_test" dataSource = "#ProdDB#" returnCode = "No"> 
    <cfprocparam type="in" cfsqltype="CF_SQL_INTEGER" variable="nTypeIn" value="#nTypeIn#" null="No"> 
    <cfprocparam type="out" cfsqltype="CF_SQL_INTEGER" variable="nTypeOut" value="#nTypeOut#" null="No"> 
</cfstoredproc> 

<cfdump var="#nTypeIn#"> 
<cfdump var="#nTypeOut#"> 

В Oracle в конце этого теста nTypeIn будет 10, но nTypeOut будет 100 не 10. Это может быть очень полезно до тех пор, пока вы ожидаете, что база данных хранит proc для ее изменения.

Надеюсь, что пролить немного больше света на вопрос.

+0

@ kevink - Да, +1 на запутанном выборе слова. Как вы говорите, некоторые особенности будут различаться в зависимости от типа базы данных. Но гораздо лучшее описание, чем в документации. – Leigh

0

Из википедии:

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

Обратите внимание на жирного шрифта участок

переменные, которые не связаны с местом, известны как свободные переменные.

+0

Другими словами, переменная, которая имеет значение, которое хранится в базе данных? – dmr

+0

Не нужно хранить в базе данных, ее выделенные и связанные с каким-то значением, могут храниться в базе данных. – JonH

+0

В приведенном выше контексте речь идет о использовании переменных привязки в базе данных. Это позволяет вам иметь динамические запросы, которые имеют план сборки, и, теоретически, повысить производительность. – ale

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