Oracle ВЫПОЛНЯЕТСЯ НЕПОСРЕДСТВЕННЫЙ с переменным количеством, связывает возможный?

Просто передайте контекст и передайте объект запроса. если вы используете @api_view

serializer = CustomerSerializer(customer, context={"request": request})

Для пользователя ViewSet метод get_serializer_context

class ProjectViewSet(viewsets.ModelViewSet):
queryset = Project.objects.all()
serializer_class = ProjectSerializer

def get_serializer_context(self):
    return {'request': self.request}
11
задан sampathsris 18 April 2015 в 01:08
поделиться

4 ответа

Вы не можете сделать это с помощью EXECUTE IMMEDIATE . Однако это можно сделать с помощью пакета Oracle DBMS_SQL . В Руководстве разработчика приложений баз данных есть сравнение между EXECUTE IMMEDIATE , с которым вы знакомы, и методами dbms_sql . Эта страница документирует DBMS_SQL , но содержит несколько примеров (ссылки выше), которые должны помочь вам начать работу (пример 1 - простой случай выполнения оператора, который может иметь произвольное количество переменных связывания ). DBMS_SQL намного более громоздко с точки зрения кодирования, но позволяет делать практически все, что вы можете придумать.

Допускается несколько экземпляров переменной связывания, встречающейся в SQL. Однако вам нужно будет знать имя, используемое в качестве переменной связывания (например: var в вашем случае), чтобы передать его в DBMS_SQL.BIND_VARIABLE .

10
ответ дан 3 December 2019 в 05:36
поделиться

This Thread on AskTom covers the subject in details.

In your case if you want to pass one parameter or none, you could build two queries that have a single parameter and in one of these query it is not used (i-e the predicate is always true) like this:

-- query1
SELECT * FROM DUAL WHERE dummy = :x;

-- query2
SELECT * FROM DUAL WHERE nvl(:x, 1) IS NOT NULL;

You can probably refine the predicate so that the optimizer will understand that it is always true.

2
ответ дан 3 December 2019 в 05:36
поделиться

One can use dbms_sql like Steve Broberg explained but the resulting cursor can't be consumed (read) in a lot of clients. Oracle 11 has added a conversion function (dbms_sql.to_refcursor) that makes it possible to convert a dbms_sql cursor to a ref cursor but for some reason one can't consume this converted ref cursor in a .Net application. One can consume a normal ref cursor in .net but not a ref cursor that used to be dbms_sql cursor.

So what kind of client will be consuming this cursor?

1
ответ дан 3 December 2019 в 05:36
поделиться

Эту проблему также можно обойти, используя оператор WITH . Обычно лучше использовать DBMS_SQL , но иногда это более простой способ:

BEGIN
    EXECUTE IMMEDIATE 'WITH var AS (SELECT :var FROM dual) SELECT SYSDATE FROM DUAL WHERE (SELECT * FROM var) = (SELECT * FROM var)' USING 1;
END;
7
ответ дан 3 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: