سؤال

لدي وظيفة 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top