2015-03-09 2 views
0

Я хочу написать хранимую процедуру в Oracle передавая динамическое значение, как показано ниже:Dynamic Выберите запрос в Oracle хранимой процедуры

create or replace PROCEDURE DETAILDISCDATA2 
(
    USERTYPE IN VARCHAR2, 
    BID IN NUMBER, 
    SORT_COLUMN IN VARCHAR2, 
    SORT_ORDER IN VARCHAR2, 
    catCur OUT SYS_REFCURSOR 
) AS 
COUNTRY_CODE VARCHAR2(10) := 'USA'; 

v_sql varchar2(1000); 
BEGIN 

v_sql := 'SELECT bd.*, BD.ATS_ITEM_LIST_PRICE_UNIT as UNIT_NORMAL_NET, BD.ITEM_LIST_PRICE_TOTAL as NORMAL_NET ' 
' FROM bdetail BD ' 
' LEFT OUTER JOIN CATALOG_SCH_DISC DD ' 
' ON BD.MAT_NR  = DD.PRODUCT_NO ' 
' AND DD.COUNTRY_CODE= :a '; 
' AND BD.Id = :b order by :c :d'; 

EXECUTE IMMEDIATE v_sql using COUNTRY_CODE, BID ,SORT_COLUMN,SORT_ORDER; 

END DETAILDISCDATA2; 

Когда я выполнить эту хранимую процедуру, он отображает выход без данных, но если я бегу Тот же самый запрос со статическим значением дает соответствующей выходной

+0

Я не уверен, чего вы пытаетесь достичь, но эта процедура не будет «отображать» что-либо. Он даже не выполнит инструкцию SELECT, если нет предложения INTO или BULK COLLECT INTO. –

+0

. Я хочу динамически извлекать записи с динамическим сортировочным столбцом и порядком сортировки. –

+0

. Спасибо за отзывы. Марцин, не могли бы вы дать мне обновленный запрос –

ответ

2

From the documentation:

Если dynamic_sql_statement является ЗЕЬЕСТОМ, и опустить обе in_clause и bulk_collect_into_clause, а затем execute_immediate_statement никогда не выполняется.

У вас нет предложения into как часть вашего execute immediate.

Однако FROMTHE OUT параметра, это выглядит как то, что вы действительно хотите, чтобы открыть реф курсор для этого запроса:

OPEN catCur FOR v_sql using COUNTRY_CODE, BID ,SORT_COLUMN,SORT_ORDER; 

Вы не можете указать имена столбцов в order_by с переменным связыванием, хотя. Вы должны были бы объединить тех, так что было бы:

v_sql := 'SELECT bd.*, BD.ATS_ITEM_LIST_PRICE_UNIT as UNIT_NORMAL_NET, ' 
|| ' BD.ITEM_LIST_PRICE_TOTAL as NORMAL_NET ' 
|| ' FROM bdetail BD ' 
|| ' LEFT OUTER JOIN CATALOG_SCH_DISC DD ' 
|| ' ON BD.MAT_NR  = DD.PRODUCT_NO ' 
|| ' AND DD.COUNTRY_CODE= :a ' 
|| ' AND BD.Id = :b ' 
|| ' order by ' || SORT_COLUMN || ' ' || SORT_ORDER; 

OPEN catCur FOR v_sql using COUNTRY_CODE, BID; 
1

Ну,

1) Я думаю, что вы хотите использовать параметр catCur как это:

open catCur for 'SELECT ....'; 

, а затем передать параметр где-то еще - где вы хотите его использовать

2) Эта часть: «... упорядочивается: c: d» не будет работать. Вы не можете передавать имена столбцов в качестве переменных. Вам нужно будет построить свой оператор со статическими именами столбцов.

3) Ваше исполнение немедленно ничего не сделает в этой форме. См EXECUTE IMMEDIATE doc:

Если dynamic_sql_statement является ЗЕЬЕСТ, и вы опустите и into_clause и bulk_collect_into_clause, то execute_immediate_statement никогда не выполняет. Например, этот оператор никогда не увеличивает последовательность:

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