此代码适用于在本地(隐藏敏感信息)上运行的SAS EG:
*---- two values: DEV (ALIASDEV) and PROD (ALIASPROD);
%let my_environment = ALIASDEV;
%let ALIASPROD= (hidden_tns_prod);
%let ALIASDEV= (hidden_tns_dev);
libname mylib oracle user=username password='my_password' path="&&my_environment";
但是这段代码没有(使用rsubmit;)
rsubmit;
*---- two values: DEV (ALIASDEV) and PROD (ALIASPROD);
%let my_environment = ALIASDEV;
%let ALIASPROD= (hidden_tns_prod);
%let ALIASDEV= (hidden_tns_dev);
libname mylib oracle user=username password='my_password' path="&&my_environment";
endrsubmit;
这是错误消息:
错误:ORACLE连接错误:ORA-12154:TNS:无法解析 连接标识符指定。错误:LIBNAME语句出错。
我要做的是拥有一个宏(my_environment),我可以切换到我的dev和prod数据库之间无缝地工作。
由于
答案 0 :(得分:4)
我不知道为什么它在当地工作,但是&符号需要第三个才能正确解决。无论何时将宏变量的值存储在另一个宏变量中,都必须使用三个&符号来检索它。
基本用例:
&val_sept
和&val_oct
,则可以使用&&val_&mon
来检索%let mon=sept
。&sept
和&oct
,那么您可以使用&&&mon.
从变量&sept
中检索%let mon=sept
。这是因为多个&符号如何解决; SAS会进行多次传递,直到所有问题都得到解决。
每次传球:
所以:
%let x=a;
%let a=b;
%let b=c;
%put &&x;
1:&&x
- > (&&)(x)
- > (&)(x)
- > &x
2:&x
- >一个
%put &&&x;
1:&&&x
- > (&&)(&x)
- > (&)(a)
- > &a
2:&a
- > B'/ P>
%put &&&&x;
1:&&&&x
- > (&&)(&&) (x)
- > (&)(&)(x)
- > &&x
2:&&x
- > (&&)(x)
- > (&)(x)
- > &x
2:&x
- >一个
%put &&&&&x;
1:&&&&&x
- > (&&)(&&)(&x)
- > (&)(&)(a)
- > &&a
2:&&a
- > (&&)(a)
- > (&a
)
3:&a
- > B'/ P>
%put &&&&&&x;
1:&&&&&&x
- > (&&)(&&)(&&) (x)
- > (&)(&)(&)(x)
- > &&&x
2:&&&a
- > (&&)(&x)
- > (&a
)
3:&a
- > B'/ P>
四个&符号对我来说是最有趣的,因为添加一个&符号实际上会让你有效地退步。
有关详细信息,请参阅我在sas MACRO ampersand上的回答。
答案 1 :(得分:2)
您可能需要额外的&在您的路径规范中,以便它解析为“(hidden_tns_dev)”而不是“ALIASDEV”,如下所示:path =“&&& my_environment”。