كيفية استخدام نوع Boolean في عبارة SELECT
سؤال
لدي وظيفة PL / SQL مع Boolean In المعلمة:
function get_something(name in varchar2, ignore_notfound in boolean);
هذه الوظيفة هي جزء من أداة الطرف الثالث، لا يمكنني تغيير هذا.
أرغب في استخدام هذه الوظيفة داخل عبارة مختارة مثل هذا:
select get_something('NAME', TRUE) from dual;
هذا لا يعمل، أحصل على هذا الاستثناء:
ORA-00904: "صحيح": معرف غير صالح
كما أفهمها، كلمة رئيسية TRUE
غير معترف بها.
كيف يمكنني إجراء هذا العمل؟
المحلول
يمكنك بناء وظيفة التفاف مثل هذا:
function get_something(name in varchar2,
ignore_notfound in varchar2) return varchar2
is
begin
return get_something (name, (upper(ignore_notfound) = 'TRUE') );
end;
ثم اتصل:
select get_something('NAME', 'TRUE') from dual;
الأمر متروك لك ما هي القيم الصالحة لل IGNORE_NOTFOUND في الإصدار الخاص بك، لقد افترضت أن "صحيح" يعني صحيح وأي شيء آخر يعني خطأ.
نصائح أخرى
يمكنك بالتأكيد الحصول على قيمة منطقية من استعلام محدد، لا يمكنك فقط استخدام نوع بيانات منطقية.
يمكنك تمثيل منطقية مع 1/0.
CASE WHEN (10 > 0) THEN 1 ELSE 0 END (It can be used in SELECT QUERY)
SELECT CASE WHEN (10 > 0) THEN 1 ELSE 0 END AS MY_BOOLEAN_COLUMN
FROM DUAL
إرجاع، 1 (في السبات / mybatis / etc 1 صحيح). خلاف ذلك، يمكنك الحصول على القيم المنطقية القابلة للطباعة من تحديد.
SELECT CASE WHEN (10 > 0) THEN 'true' ELSE 'false' END AS MY_BOOLEAN_COLUMN
FROM DUAL
هذا إرجاع السلسلة 'true'
.
من توثيق:
لا يمكنك إدراج القيم
TRUE
وFALSE
في عمود قاعدة البيانات. لا يمكنك تحديد أو جلب قيم الأعمدة فيBOOLEAN
عامل. وظائف تسمى منSQL
لا يمكن الاستعلام اتخاذ أيBOOLEAN
المعلمات. لا يمكن المدمجSQL
وظائف مثلTO_CHAR
; ؛ لتمثيلBOOLEAN
القيم في الإخراج، يجب عليك استخدامIF-THEN
أوCASE
يبني للترجمةBOOLEAN
القيم في نوع آخر، مثل0
أو1
,'Y'
أو'N'
,'true'
أو'false'
, ، وما إلى ذلك وهلم جرا.
سوف تحتاج إلى جعل وظيفة التفاف التي تأخذ SQL
Datatype واستخدامه بدلا من ذلك.
نوع البيانات المنطقي هو نوع بيانات PL / SQL. لا توفر Oracle نوع بيانات SQL مكافئ (...) يمكنك إنشاء وظيفة غلاف يقوم بالخرائط نوع SQL إلى النوع المنطقي.
افحص هذا: http://forums.datadirect.com/ddforums/thread.jspa؟threadid=1771&tstart=0&messageid=5284.
select get_something('NAME', sys.diutil.int_to_bool(1)) from dual;
ترجمة هذا في قاعدة البيانات الخاصة بك والبدء في استخدام عبارات المنطقية في استفساراتك.
ملاحظة: تحصل الوظيفة على Param A varchar2، لذا تأكد من التفاف أي "سلاسل" في بيانك. سيعود 1 صحيح و 0 للخطأ؛
select bool('''abc''<''bfg''') from dual;
CREATE OR REPLACE function bool(p_str in varchar2) return varchar2
is
begin
execute immediate ' begin if '||P_str||' then
:v_res := 1;
else
:v_res := 0;
end if; end;' using out v_res;
return v_res;
exception
when others then
return '"'||p_str||'" is not a boolean expr.';
end;
/
الإجابة على هذا السؤال وضعت ببساطة: لا تستخدم المنطقية مع Oracle-- PL / SQL غبية ولا تعمل. استخدم نوع بيانات آخر لتشغيل عمليةك.
ملاحظة إلى مطوري تقرير SSRS مع Oracle DataSource: يمكنك استخدام المعلمات المنطقية، ولكن كن حذرا كيف تنفذ. لا يلعب Oracle PL / SQL بشكل جيد مع منطقي، ولكن يمكنك استخدام القيمة المنطقية في مرشح Tablix إذا كانت البيانات موجودة في DataSet. هذا يعثرني حقا، لأنني استخدمت معلمة منطقية مع مصدر بيانات Oracle. ولكن في هذه الحالة كنت تصفية ضد بيانات Tablix، وليس استعلام SQL.
إذا لم تكن البيانات في حقول DataSet SSRS الخاصة بك، فيمكنك إعادة كتابة شيء SQL مثل هذا باستخدام معلمة عدد صحيح:
__
<ReportParameter Name="paramPickupOrders">
<DataType>Integer</DataType>
<DefaultValue>
<Values>
<Value>0</Value>
</Values>
</DefaultValue>
<Prompt>Pickup orders?</Prompt>
<ValidValues>
<ParameterValues>
<ParameterValue>
<Value>0</Value>
<Label>NO</Label>
</ParameterValue>
<ParameterValue>
<Value>1</Value>
<Label>YES</Label>
</ParameterValue>
</ParameterValues>
</ValidValues>
</ReportParameter>
...
<Query>
<DataSourceName>Gmenu</DataSourceName>
<QueryParameters>
<QueryParameter Name=":paramPickupOrders">
<Value>=Parameters!paramPickupOrders.Value</Value>
</QueryParameter>
<CommandText>
where
(:paramPickupOrders = 0 AND ordh.PICKUP_FLAG = 'N'
OR :paramPickupOrders = 1 AND ordh.PICKUP_FLAG = 'Y' )
إذا كانت البيانات في حقول DataSet الخاصة بك SSRS، فيمكنك استخدام عامل تصفية Tableix مع معلمة منطقية:
__
</ReportParameter>
<ReportParameter Name="paramFilterOrdersWithNoLoad">
<DataType>Boolean</DataType>
<DefaultValue>
<Values>
<Value>false</Value>
</Values>
</DefaultValue>
<Prompt>Only orders with no load?</Prompt>
</ReportParameter>
...
<Tablix Name="tablix_dsMyData">
<Filters>
<Filter>
<FilterExpression>
=(Parameters!paramFilterOrdersWithNoLoad.Value=false)
or (Parameters!paramFilterOrdersWithNoLoad.Value=true and Fields!LOADNUMBER.Value=0)
</FilterExpression>
<Operator>Equal</Operator>
<FilterValues>
<FilterValue DataType="Boolean">=true</FilterValue>
</FilterValues>
</Filter>
</Filters>
مع Oracle 12، يمكنك استخدام WITH
جملة لإعلان الوظائف الإضافية الخاصة بك. أنا أفترض لك get_something
عودة الدالة varchar2
:
with
function get_something_(name varchar2, ignore_notfound number)
return varchar2
is
begin
-- Actual function call here
return get_something(name, not ignore_notfound = 0);
end get_something_;
-- Call auxiliary function instead of actual function
select get_something_('NAME', 1) from dual;
بالطبع، يمكنك أيضا تخزين وظيفة المساعدة الخاصة بك في مكان ما في المخطط كما هو مبين في هذه الإجابة, ، ولكن باستخدام WITH
, ، ليس لديك أي تبعيات خارجية لمجرد تشغيل هذا الاستعلام. لقد بلوق حول هذه التقنية أكثر بالتفصيل هنا.
ماذا عن استخدام تعبير يقيم إلى True (أو خطأ)؟
select get_something('NAME', 1 = 1) from dual
PL / SQL يشكو من أنه صحيح ليس معرف صالحا، أو متغير. قم بإعداد متغير محلي، قم بتعيينه على True، وقم بتمريره إلى وظيفة Get_Something.