2013-06-16 7 views
7

क्या पीएल/एसक्यूएल में एक चर का सटीक प्रकार दिखाने के लिए कोई फ़ंक्शन है, जैसे SQL में DUMP फ़ंक्शन?पीएल/एसक्यूएल में एक चर के प्रकार को कैसे देखें?

मैं निम्नलिखित

DECLARE 
    l_variable INTEGER := 1; 
BEGIN 
    DBMS_OUTPUT.PUT_LINE (DUMP (l_variable)); 
END; 

की कोशिश की है लेकिन यह निम्न त्रुटि देता है:

PLS-00204: function or pseudo-column 'DUMP' may be used inside a SQL statement only

+1

आप ऐसा क्यों करना चाहते हैं? DUMP() एक नैदानिक ​​उपकरण है, मुख्य रूप से तालिका कॉलम के * सामग्री * की जांच के लिए उपयोग किया जाता है। आपको पीएल/एसक्यूएल चर के डेटाटाइप पूछताछ की आवश्यकता क्यों है? (मेरे पास कुछ परिकल्पनाएं हैं, लेकिन मुझे लगता है कि उपयोग मामले के बारे में अधिक जानकारी के द्वारा प्रश्न में सुधार किया जाएगा।) – APC

+0

शुरुआत में मैं सिर्फ एक संख्यात्मक फॉर लूप में ऑटोोडक्लेयर लूप चर के सटीक प्रकार को जानना चाहता था। तब मैंने सोचना शुरू कर दिया कि मैं किसी भी प्रकार की वास्तविक भाषा को प्रोग्रामेटिक रूप से कैसे प्राप्त कर सकता हूं, जैसे किसी भी आधुनिक भाषा जैसे सी #, जावा या पायथन, और मुझे कोई रास्ता नहीं मिला है। – csadam

उत्तर

5

आप इस समारोह PL/Scope का उपयोग कर बना सकते हैं। लेकिन यह अनाम ब्लॉक के साथ काम नहीं करेगा, और आपको चर को एक स्ट्रिंग के रूप में संदर्भित करने की आवश्यकता होगी।

create or replace function get_plsql_type_name 
(
    p_object_name varchar2, 
    p_name varchar2 
) return varchar2 is 
    v_type_name varchar2(4000); 
begin 
    select reference.name into v_type_name 
    from user_identifiers declaration 
    join user_identifiers reference 
     on declaration.usage_id = reference.usage_context_id 
     and declaration.object_name = reference.object_name 
    where 
     declaration.object_name = p_object_name 
     and declaration.usage = 'DECLARATION' 
     and reference.usage = 'REFERENCE' 
     and declaration.name = p_name; 

    return v_type_name; 
end; 
/

उदाहरण:

alter session set plscope_settings = 'IDENTIFIERS:ALL'; 

create or replace type my_weird_type is object 
(
    a number 
); 

create or replace procedure test_procedure is 
    var1 number; 
    var2 integer; 
    var3 my_weird_type; 
    subtype my_subtype is pls_integer range 42 .. 43; 
    var4 my_subtype; 
begin 
    dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'VAR1')); 
    dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'VAR2')); 
    dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'VAR3')); 
    dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'VAR4')); 
end; 
/

begin 
    test_procedure; 
end; 
/

NUMBER 
INTEGER 
MY_WEIRD_TYPE 
MY_SUBTYPE 
+0

मुझे अभी एहसास हुआ कि यह कुछ मुद्दों में चलाया जा सकता है कि इसका उपयोग कैसे किया जाता है। यदि चर मौजूद नहीं है तो आपको 'NO_DATA_FOUND' मिलेगा, और यदि ऑब्जेक्ट में एक ही नाम के साथ दो चर हैं तो आपको' ORA-01422 मिलेगा: सटीक फ़ेच पंक्तियों की अनुरोधित संख्या से अधिक लौटाता है '। –

+0

कोई समस्या नहीं, मुझे विचार मिल गया है। मैंने केवल 11 जी से पुराने संस्करणों का उपयोग किया था इसलिए मुझे इस सुविधा के बारे में पता नहीं था। ऐसा लगता है कि मुझे अपना ज्ञान अपडेट करना है क्योंकि 12 सी भी बाहर है :) – csadam

1
declare 
    a number(10,3); 
    type_info varchar2(400); 
begin 
    a := 55.5; 
    select dump(a) into type_info from dual; 
    DBMS_OUTPUT.PUT_LINE(type_info); 
end; 
+2

मैंने इस समाधान के बारे में सोचा है, लेकिन इस मामले में निहित रूपांतरण होता है। उदाहरण के लिए यदि मैं PLS_INTEGER में जाता हूं, तो यह एक टाइप = 2 NUMBER बन जाता है। – csadam

+0

@csadam: और यह सही है। PLS_INTEGER BINARY_INTEGER का एक उप प्रकार है जो INTEGER का एक उप प्रकार है जो NUMBER के लिए उपनाम है। तो मुझे लगता है कि यह सही मूल्य देता है। –

+0

@csadam: यदि आपको लगता है कि आप टाइप डिस्कवरी के आधार पर कुछ proc/func को कॉल करेंगे तो आप गलत दिशा में जा रहे हैं। इसके लिए एक रास्ता है लेकिन इसकी अनुशंसा नहीं की जाती है। –

2

के रूप में आप नोटिस देना चाहिए, DUMP एक ओवरलोड कार्य है। इसमें 3 ओवरलोड हैं।

तो आप अपने कोड के भीतर एक ही चीज़ अनुकरण कर सकते हैं।

function myDump (x Varchar2) return varchar2 is begin return('string') ; end ; 
function myDump (x number) return varchar2 is begin return('integer') ; end ; 
function myDump (x date) return varchar2 is begin return('date') ; end ; 

उपरोक्त कोड ठीक से काम नहीं कर सकता है लेकिन आपको समस्या को हल करने का विचार देना चाहिए।

मुझे आशा है कि यह आपकी आवश्यकताओं को पूरा करेगा।

नोट; आप इन कार्यों को एक पैकेज में डाल सकते हैं और तदनुसार उनका उपयोग कर सकते हैं।

+0

यह समाधान 'NUMBER' और 'INTEGER' के बीच अंतर करने में सक्षम नहीं होगा। यदि आप पैकेज में प्रत्येक प्रकार के लिए फ़ंक्शन बनाते हैं तो यह संकलित होगा, लेकिन जब आप इसे कॉल करेंगे तो आपको त्रुटि संदेश 'पीएलएस -00307 मिलेगा:' MYDUMP 'की बहुत अधिक घोषणाएं इस कॉल से मेल खाते हैं। इस प्रश्न का वास्तव में मुश्किल हिस्सा उपप्रकारों के बीच अंतर कर रहा है, क्योंकि पीएल/एसक्यूएल को हर संदर्भ में अंतर नहीं लगता है। –

+0

हाय अली, रचनात्मक दृष्टिकोण। यह @Jonearles के रूप में सही नहीं है, लेकिन 11 जी के तहत डीबी संस्करणों में दूसरों की तुलना में अभी भी बेहतर है। मैं इसे 11 जी के तहत उत्तर के लिए स्वीकार कर सकता हूं। लेकिन मैंने सवाल में डीबी संस्करण को बाधित नहीं किया है, और 11 जी समाधान बेहतर है, इसलिए मुझे jonearles – csadam

+0

पर बक्षीस देना होगा ये कार्य केवल मूल प्रकार के ऑरैकल के लिए काम करेंगे। और ऑरैक मूल प्रकार संख्या और पूर्णांक के बीच कोई फर्क नहीं पड़ता है। @ जेनियरल्स ने एक अच्छा स्पष्टीकरण दिया, कारण मैंने आपको एक और विकल्प दिया है कि आपके पास एक आसान अनुरोध हो सकता है। –

संबंधित मुद्दे