हाँ, अंत में वहाँ है :) एसक्यूएल मानक 2016 को परिभाषित करता है Polymorphic Table Functions
एसक्यूएल: 2016 का परिचय बहुरूपी तालिका कार्य (PTF) कि परिणाम प्रकार अग्रिम निर्दिष्ट करने की आवश्यकता नहीं है। इसके बजाए, वे एक वर्णन घटक प्रक्रिया प्रदान कर सकते हैं जो रन टाइम पर रिटर्न प्रकार निर्धारित करता है। न तो पीटीएफ के लेखक और न ही पीटीएफ के उपयोगकर्ता को वापस आने वाले कॉलम घोषित करने की आवश्यकता है।
एसक्यूएल द्वारा वर्णित पीटीएफ: 2016 अभी तक किसी भी परीक्षण डेटाबेस में उपलब्ध नहीं हैं। 10 इच्छुक पाठक आईएसओ द्वारा जारी "तकनीकी में पॉलिमॉर्फिक टेबल फ़ंक्शन" मुक्त तकनीकी रिपोर्ट का संदर्भ ले सकते हैं। उदाहरण निम्न हैं रिपोर्ट में चर्चा के कुछ:
CSVreader, जो संख्या और बदले कॉलम के नाम निर्धारित करने के लिए एक सीवीएस फ़ाइल के हेडर लाइन पढ़ता
धुरी (वास्तव में unpivot) मुझे -: है, जो पंक्तियाँ (PHONETYPE, फ़ोननंबर उदाहरण): में स्तंभ समूहों बदल जाता है और नहीं harcoded तार :)
TopNplus है, जो विभाजन और एक अतिरिक्त प्रति पंक्ति एन पंक्तियों शेष पंक्तियों
के योग के साथ के माध्यम से गुजरता
Oracle 18c
इस तंत्र लागू करता है। 18c Skip_col Polymorphic Table Function Example Oracle Live SQL और Skip_col Polymorphic Table Function Example
यह उदाहरण दिखाता है नाम/विशिष्ट डेटाप्रकार के आधार पर डेटा को छोड़ने के लिए कैसे:
CREATE PACKAGE skip_col_pkg AS
-- OVERLOAD 1: Skip by name
FUNCTION skip_col(tab TABLE, col columns)
RETURN TABLE PIPELINED ROW POLYMORPHIC USING skip_col_pkg;
FUNCTION describe(tab IN OUT dbms_tf.table_t,
col dbms_tf.columns_t)
RETURN dbms_tf.describe_t;
-- OVERLOAD 2: Skip by type --
FUNCTION skip_col(tab TABLE,
type_name VARCHAR2,
flip VARCHAR2 DEFAULT 'False')
RETURN TABLE PIPELINED ROW POLYMORPHIC USING skip_col_pkg;
FUNCTION describe(tab IN OUT dbms_tf.table_t,
type_name VARCHAR2,
flip VARCHAR2 DEFAULT 'False')
RETURN dbms_tf.describe_t;
END skip_col_pkg;
और शरीर:
CREATE PACKAGE BODY skip_col_pkg AS
/* OVERLOAD 1: Skip by name
* NAME: skip_col_pkg.skip_col
* ALIAS: skip_col_by_name
*
* PARAMETERS:
* tab - The input table
* col - The name of the columns to drop from the output
*
* DESCRIPTION:
* This PTF removes all the input columns listed in col from the output
* of the PTF.
*/
FUNCTION describe(tab IN OUT dbms_tf.table_t,
col dbms_tf.columns_t)
RETURN dbms_tf.describe_t
AS
new_cols dbms_tf.columns_new_t;
col_id PLS_INTEGER := 1;
BEGIN
FOR i IN 1 .. tab.column.count() LOOP
FOR j IN 1 .. col.count() LOOP
tab.column(i).pass_through := tab.column(i).description.name != col(j);
EXIT WHEN NOT tab.column(i).pass_through;
END LOOP;
END LOOP;
RETURN NULL;
END;
/* OVERLOAD 2: Skip by type
* NAME: skip_col_pkg.skip_col
* ALIAS: skip_col_by_type
*
* PARAMETERS:
* tab - Input table
* type_name - A string representing the type of columns to skip
* flip - 'False' [default] => Match columns with given type_name
* otherwise => Ignore columns with given type_name
*
* DESCRIPTION:
* This PTF removes the given type of columns from the given table.
*/
FUNCTION describe(tab IN OUT dbms_tf.table_t,
type_name VARCHAR2,
flip VARCHAR2 DEFAULT 'False')
RETURN dbms_tf.describe_t
AS
typ CONSTANT VARCHAR2(1024) := upper(trim(type_name));
BEGIN
FOR i IN 1 .. tab.column.count() LOOP
tab.column(i).pass_through :=
CASE upper(substr(flip,1,1))
WHEN 'F' THEN dbms_tf.column_type_name(tab.column(i).description)
!=typ
ELSE dbms_tf.column_type_name(tab.column(i).description)
=typ
END /* case */;
END LOOP;
RETURN NULL;
END;
END skip_col_pkg;
और नमूना उपयोग:
-- skip number cols
SELECT * FROM skip_col_pkg.skip_col(scott.dept, 'number');
-- only number cols
SELECT * FROM skip_col_pkg.skip_col(scott.dept, 'number', flip => 'True')
-- skip defined columns
SELECT *
FROM skip_col_pkg.skip_col(scott.emp, columns(comm, hiredate, mgr))
WHERE deptno = 20;
मैं अत्यधिक उदाहरण पढ़ने के लिए अत्यधिक अनुशंसा करते हैं (स्टैंडअलोन फंक्शन बनाते हैं पैकेज कॉल के बजाय आयनों)।
उदाहरण के लिए आप आसानी से अधिभार छोड़ सकते हैं: कॉलम छोड़ें जो विशिष्ट उपसर्ग/प्रत्यय के साथ प्रारंभ/समाप्त नहीं होता है।
EXCEPT कीवर्ड SQL सर्वर के भीतर मौजूद है, हालांकि इसका उपयोग यह नहीं है कि आप अपने प्रश्न में कैसा चाहें। यह दो परिणामों के बीच एक अंतर संघ बनाता है जो आपको पहले परिणाम में मौजूद "रिकॉर्ड" का परिणाम देता है लेकिन दूसरे परिणाम –
में मौजूद नहीं है यह चूसता है कि यह अस्तित्व में नहीं है। – VISQL
संभव डुप्लिकेट [एसक्यूएल SELECT \ * \ का उपयोग कर कॉलम को बाहर निकालें [कॉलम ए को छोड़कर \]] tableA से?] (Http://stackoverflow.com/questions/729197/sql-exclude-a-column-using-select-except- columna-from-tablea) – billinkc