PLS-00312: ассоциация позиционного параметра может не следовать за именованной ассоциацией - PullRequest
1 голос
/ 06 марта 2019

Кто-нибудь знает, как я могу избежать ошибки PLS-00312 здесь?

"PLS-00312: ассоциация позиционных параметров может не следовать за именованной ассоциацией"

Я получаю это из-за следующей строки:

AttachList=> v_est_proc_name||'_EST_PROC.csv',v_prd_segs||'_PRD_SEGS.csv',

В приведенном нижепроцедура:

create or replace procedure send_csv as

v_tomail varchar2(40);
v_est_proc_name varchar2(40);
v_prd_segs varchar2(40); 

cursor c1 is
SELECT email_address
INTO v_tomail
FROM mail where
mdate = (select max(mdate) FROM blah)
group by email_address  
order by max(mdate) desc;

begin
open c1;
fetch c1 into v_tomail;

SELECT tablename into v_est_proc_name
FROM blah_blah
WHERE
CREATED_AT = (select MAX(CREATED_AT) from blah);

SELECT tablename into v_prd_segs
FROM blah_blah
WHERE
CREATED_AT = (select MAX(CREATED_AT) from blah);

mail.send_mail.send(
ToList=> v_tomail,
Subject=> 'see attachments',
Body=> 'Please action the attached files for this request.',
FromEmail=> 'donotreply@mail.com', 
FromHost=> 'host',
SMTPServer=> 'host',
AttachList=> v_est_proc_name||'_EST_PROC.csv',v_prd_segs||'_PRD_SEGS.csv',

Directory=> 'CSV_DIR');
End;

Я просто не знаю, как от этого избавиться ... должен быть способ.

Ответы [ 3 ]

3 голосов
/ 06 марта 2019

Сообщение самоочевидно.

Предположим, у вас есть процедура или функция (скажем, процедура, если быть точным), my_proc, с четырьмя параметрами:

my_proc(param1, param2, param3, param4)

Учитывая значения для четырех параметров, arg1, arg2, arg3, arg4, вы можете вызвать процедуру следующим образом:

my_proc(arg1, arg2, arg3, arg4)

- при этом используется позиционное сопоставление параметра.Порядок аргументов имеет значение.

Вы также можете назвать его так:

my_proc(param1 => arg1, param3 => arg3, param2 => arg2, param4 => arg4)

- здесь используется именованная ассоциация параметров.Порядок «ассоциаций» больше не имеет значения - вы можете размещать назначения (ассоциации) в любом порядке, который вам нравится, если вы соединяете правильный аргумент с правильным именем параметра.

Вы также можете смешиватьих, но вы можете использовать ТОЛЬКО сначала позиционную ассоциацию, а затем именованную ассоциацию.Это законно:

my_proc(arg1, arg2, param4 => arg4, param3 => arg3)

, но это незаконно:

my_proc(arg1, param3 => arg3, param2 => arg2, arg4)

Есть очень веские причины для этого, но причины не имеют значения;это синтаксическое требование, которому должен следовать ваш код, даже если для этого не было веских причин.

В вашем коде все ассоциации названы, кроме аргумента (значения)

v_prd_segs||'_PRD_SEGS.csv'

, который не назначен определенному именованному параметру.

Чтобы исправить это, используйте имя параметра, который должен принимать этот аргумент, как вы делали это для всех других параметров.

3 голосов
/ 06 марта 2019

Смотрите здесь, где вы говорите:

AttachList => v_est_proc_name || '_EST_PROC.csv', v_prd_segs || '_PRD_SEGS.csv',

Битвыделено жирным шрифтом и рассматривается как отдельный аргумент для mail.send_mail.send (), но перед ним нет имени аргумента, как это делают все остальные аргументы, поэтому оракул не знает, для какого аргумента он предназначен

Укажите имя аргумента, которым должны быть эти данные.Если вы пытаетесь отправить несколько вложений, я думаю, что это должна быть строка, разделенная запятыми, но ваша запятая находится вне какой-либо строки, и оракул думает, что это запятая, которая разделяет список аргументов функции (два аргумента)

Попробуйте что-то вроде:

AttachList=> v_est_proc_name||'_EST_PROC.csv,'||v_prd_segs||'_PRD_SEGS.csv',

Это ставит запятую, разделяющую имена файлов внутри строки

Ошибка в основном означает «вы можете смешивать только позиционные аргументы и именованные аргументы, если вы поместите позиционные аргументысначала затем переключитесь на имя "

Для функции:

F(a, b, c)

--these are ok
F(1,2,3). --positional arguments go in order
F(c=> 3, b=> 2, a=> 1) --named arguments any order
F(1. c=> 3, b=> 2) --mixed, a is 1 in order, other two are any order

--going back to using positional after you started using names is not ok
F(b=> 2, 1, 3)

В последнем примере это ошибка, потому что oracle не может самостоятельно решить, является ли A 1 или 3 (и, следовательно, C является3 или 1)

Редактировать:

ОК, возможно, я слишком долго работал с SQLS и забыл свой Oracle.Если вы утверждаете, что вы не можете связать значения concat вместе для аргумента (то есть вы должны сначала сохранить их в переменной), почему бы не попробовать это:

SELECT tablename||'_EST_PROC.csv,' into v_est_proc_name
FROM blah_blah
WHERE
CREATED_AT = (select MAX(CREATED_AT) from blah);

SELECT v_est_proc_name||tablename||'_PRD_SEGS.csv' into v_est_proc_name
FROM blah_blah
WHERE
CREATED_AT = (select MAX(CREATED_AT) from blah);

mail.send_mail.send(
ToList=> v_tomail,
Subject=> 'see attachments',
Body=> 'Please action the attached files for this request.',
FromEmail=> 'donotreply@mail.com', 
FromHost=> 'host',
SMTPServer=> 'host',
AttachList=> v_est_proc_name,

Возможно, вы могли бы также рассмотреть больший размердля строки (40 немного меньше?) и лучшего имени.Я пытался проверить это, но у меня нет живого экземпляра Oracle, и я не добился успеха в том, чтобы заставить различные сайты-скрипки создавать функции ..

0 голосов
/ 06 марта 2019

Попробуйте еще раз взглянуть на эту строку:

AttachList=> v_est_proc_name||'_EST_PROC.csv',v_prd_segs||'_PRD_SEGS.csv',

Два ее аргумента, а не один.

AttachList=> v_est_proc_name||'_EST_PROC.csv',
????      => v_prd_segs||'_PRD_SEGS.csv',

Попробуйте найти имя параметра, которое должно соответствовать ???в процедуре mail.send_mail.send.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...