2016-03-23 44 views
2

如何使用select语句为变量赋值并在SQL * Plus脚本中使用它,如下所示?如何使用PL/SQL中的select语句为SQL * Plus变量赋值?

VARIABLE FullCatCode VARCHAR2(7) 

exec :FullCatCode := (SELECT CatCode from draw_catcodes where series = 123 and base = 158); 

SELECT :FullCatCode || '-' || Other stuff... from table_name... 

编辑:@AlexPoole,对不准确的问题陈述。我从280K记录数据集中提取50列数据。我正在根据辅助表(draw_catcodes)的子字符串为每个记录分配nextval序列。我正在SQL * Plus中运行SELECT语句,后台处理为CSV文件。该SQL现在看起来是这样(下面的测试你的第二个建议):

COLUMN CatCode NEW_VALUE FullCatCode; 

SELECT 
(CASE d.image WHEN 0 THEN 'NoImage.pdf' 
ELSE lower(d.prefix || lpad(d.series,3,0) || lpad(d.base,3,0) || lpad(d.suffix,2,0) || lpad(d.rev,2,0) || '.pdf') END) as "Filename", 
(SELECT EngDiscipline from draw_catcodes c where d.series = c.series and d.base = c.base) as "EngDiscipline", 

(SELECT CatCode from draw_catcodes c where d.series = c.series and d.base = c.base), 

SELECT &FullCatCode || '-' || 
lpad((CASE substr(&FullCatCode,0,3) 
WHEN 'AEG' THEN (SELECT AEG_seq.NEXTVAL FROM DUAL) 
WHEN 'ARY' THEN (SELECT ARY_seq.NEXTVAL FROM DUAL) 
WHEN 'BBR' THEN (SELECT BBR_seq.NEXTVAL FROM DUAL) 
ELSE 0 
END),6,0) as "ItemID", 
upper(d.prefix || '-' || lpad(d.series,3,0) || '-' || lpad(d.base,3,0) || '-' || lpad(d.suffix,2,0)) as "LegacyID", 
... 
from tablename where ... 

我开始与存储的功能是“Upserted”序列表(不能从功能进行DML),尝试了存储过程有一个OUT变量(无法从SQL SELECT中调用过程),现在在CASE语句中尝试序列(无法弄清楚如何使用上述变量)......任何建议都将非常感谢!

编辑:@AlexPoole,由于变量不会在这种情况下工作,我只是直接选择我的价值,然后使用CASE语句来指定正确的序列。语法是不正确的,虽然,因为我得到一个ORA-00933:

SELECT ((SELECT CatCode from draw_catcodes c where d.series = c.series and d.base = c.base) || '-' || 
lpad((CASE substr((SELECT CatCode from draw_catcodes c where d.series = c.series and d.base = c.base),0,3) 
WHEN 'AEG' THEN AEG_seq.NEXTVAL 
WHEN 'ARY' THEN ARY_seq.NEXTVAL 
WHEN 'BBR' THEN BBR_seq.NEXTVAL 
... 
WHEN 'SPR' THEN SPR_seq.NEXTVAL 
WHEN 'SRL' THEN SRL_seq.NEXTVAL 
ELSE 0 
END),6,0)) as "ItemID" FROM DUAL, 
upper(d.prefix || '-' || lpad(d.series,3,0) || '-' || lpad(d.base,3,0) || '-' || lpad(d.suffix,2,0)) as "LegacyID", 

编辑:SQL命令不能正常在下一行结束错误@AlexPoole,我添加了JOIN和清理SELECT但现在得到一个ORA-02287:这里不允许的序列号

(c.CatCode || '-' || 
(SELECT lpad(
(CASE substr(c.CatCode,0,3) 
WHEN 'AEG' THEN AEG_seq.NEXTVAL 
WHEN 'ARY' THEN ARY_seq.NEXTVAL 
WHEN 'BBR' THEN BBR_seq.NEXTVAL 
WHEN 'BSY' THEN BSY_seq.NEXTVAL 
... 
WHEN 'SDR' THEN SDR_seq.NEXTVAL 
WHEN 'SLC' THEN SLC_seq.NEXTVAL 
WHEN 'SLD' THEN SLD_seq.NEXTVAL 
WHEN 'SMS' THEN SMS_seq.NEXTVAL 
WHEN 'SPP' THEN SPP_seq.NEXTVAL 
WHEN 'SPR' THEN SPR_seq.NEXTVAL 
WHEN 'SRL' THEN SRL_seq.NEXTVAL 
ELSE 0 END),6,0) FROM DUAL)) as "ItemID", 
... 
FROM md_draw d 
join draw_catcodes c on d.series = c.series and d.base = c.base 
order by lpad(d.series,3,0), lpad(d.base,3,0), lpad(d.suffix,2,0); 

有什么建议吗?

编辑:@AlexPoole,你说得对,我取出包含序列调用你详细介绍它的子查询,但仍得到ORA-02287:序列号这里不允许错误:

SELECT 
(CASE d.image WHEN 0 THEN 'NoImage.pdf' 
ELSE lower(d.prefix || lpad(d.series,3,0) || lpad(d.base,3,0) || lpad(d.suffix,2,0) || lpad(d.rev,2,0) || '.pdf') END) as "Filename", 
c.EngDiscipline as "EngDiscipline", 
c.CatCode || '-' || lpad(CASE substr(c.CatCode,0,3) 
WHEN 'AEG' THEN AEG_seq.NEXTVAL 
WHEN 'ARY' THEN ARY_seq.NEXTVAL 
WHEN 'BBR' THEN BBR_seq.NEXTVAL 
... 
WHEN 'SPP' THEN SPP_seq.NEXTVAL 
WHEN 'SPR' THEN SPR_seq.NEXTVAL 
WHEN 'SRL' THEN SRL_seq.NEXTVAL 
ELSE 0 END,6,'0') as "ItemID", 
upper(d.prefix || '-' || lpad(d.series,3,0) || '-' || lpad(d.base,3,0) || '-' || lpad(d.suffix,2,0)) as "LegacyID", 
    ... 
FROM md_draw SAMPLE (1) d 
join draw_catcodes c on d.series = c.series and d.base = c.base 
order by c.ccProgram, lpad(d.series,3,0), lpad(d.base,3,0), lpad(d.suffix,2,0); 
+0

您只有一条语句,并且您正试图在稍后的同一语句中使用子查询中的CatCode值? –

+0

编辑问题时我没有收到通知,只是碰巧回来。为什么你仍然有一个子查询 - 这不是我的答案?那是什么导致了新的错误。你有没有看到使用分析函数而不是序列的编辑 - 如果你使用的比你最初显示的更多,可能会更有用? –

+0

@AlexPoole,删除子查询,仍然会得到相同的错误... –

回答

5

它相当容易。在PL/SQL中,查询既可以是游标,也可以选择转换为;在此,到您的绑定变量:

VARIABLE FullCatCode VARCHAR2(7) 

exec SELECT CatCode into :FullCatCode from draw_catcodes where series = 123 and base = 158; 

SELECT :FullCatCode || '-' || Other stuff... from table_name... 

如果你只打算使用它在以后的SQL语句,你也可以使用一个替代变量,而不是一个绑定变量:

COLUMN CatCode NEW_VALUE FullCatCode 

SELECT CatCode from draw_catcodes where series = 123 and base = 158; 

SELECT &FullCatCode || '-' || Other stuff... from table_name... 

随着您的修改问题,这不是你想要做的。您试图在同一查询的另一部分中引用子查询中的值,而不是稍后在脚本中的单独语句。并没有涉及PL/SQL。

你不能用上述任何一种机制来做到这一点;第一个是因为没有PL/SQL块执行select ... into,第二个是因为替换变量在语句运行之前被评估和替换 - new_value直到查询运行之后才存在。

你不想在这里一个子查询,虽然,你应该使用一个连接,像这样:

SELECT 
    CASE d.image WHEN 0 THEN 'NoImage.pdf' 
    ELSE lower(d.prefix || lpad(d.series,3,'0') || lpad(d.base,3,'0') || lpad(d.suffix,2,'0') || lpad(d.rev,2,'0') || '.pdf') 
    END as "Filename", 
    c.EngDiscipline as "EngDiscipline", 
    c.CatCode, -- not sure if you actually want this raw value? 
    c.CatCode || '-' || lpad(CASE substr(c.CatCode,0,3) 
    WHEN 'AEG' THEN AEG_seq.NEXTVAL 
    WHEN 'ARY' THEN ARY_seq.NEXTVAL 
    WHEN 'BBR' THEN BBR_seq.NEXTVAL 
    ELSE 0 
    END,6,'0') as "ItemID", 
    upper(d.prefix || '-' || lpad(d.series,3,'0') || '-' || lpad(d.base,3,'0') || '-' || lpad(d.suffix,2,'0')) 
    as "LegacyID", 
    ... 
from tablename d 
join draw_catcodes c on d.series = c.series and d.base = c.base 
where ... 

您可以直接引用c.CatCode在你试图使用&FullCatCode的地方。

如果序列只存在于这个查询和项目Id没有更广泛的意义,你可以使用一个解析函数生成ItemIds代替:

c.CatCode || '-' || 
    lpad(row_number() over (partition by substr(c.CatCode,0,3) order by null),6,'0') 
    as "ItemID", 

届时将有ItemIds不确定性的排序,但不会有序列方法;通过这个,你可以修改窗口子句来指定顺序,如果这是可取的。

+0

Thx亚历克斯! 改变SELECT我得到以下错误之后: (EXEC SELECT CatCode成:从draw_catcodesÇFullCatCode其中d.series = c.series和d.base = c.base)在第20行 * ERROR: ORA -00907:缺少右括号 此语句位于较大的Select语句中,此'Into'必须位于最外面的语句中吗? –

+0

@BarryPrentiss - 不太确定你的意思。 'exec'是一个SQL \ * Plus命令,不是SQL语句的一部分,所以不属于那里。而且,“进”必须在最外面的说法中,是的。但是,不清楚片段/子查询在哪里适合一个更大的片段 - 它是一个选择列表表达式,一个内联视图还是一个连接条件?或者我没有想过的东西...? –

+0

@BarryPrentiss - 基于我认为你想要做的事情而更新。 ItemIDs是否应该在每次运行时都从1开始,或者每次运行都应该从最后一个停止的位置开始运行?我试图弄清楚你是否真的需要序列,或者如果你只是想要一个在查询中唯一的序列式后缀。 –

相关问题