cshell plsql我中有你,你中有我的问题 求救!

scfy926 2010-09-25 10:38:04
在cshell中调用plsql,plsql中的循环中用到了cshell中定义的数组(SelectField),
如何用plsql的循环变量作为index取数组SelectField里的值?

伪代码如下:
test.csh

# 查询数据库用select文
set SelectField = "C1,C2,C3,C4"

# 变换后 FieldName = "C1 C2 C3 C4"
set FieldName = `echo $SelectField | awk '{n=split(&0,arr,",") ;for (i=1;i<=n;i++) print arr[i]}'`

# 替换项目的开始位置(数组)
set FieldStartPosition = "1,5,9,12"

# 替换项目的长度(数组)
set FieldLength = "4,4,3,5"

#sqlplus
sqlplus user/password <<EOT

DECLARE
TYPE intVarray IS VARRAY(#$FieldName) OF INTEGER;
--cshell数组变换成sqlplus的数组(项目开始位置)
vFieldStartOption intVarry := intVarray(${FieldStartOption});
--cshell数组变换成sqlplus的数组(项目长度)
vFieldLength intVarry := intVarray(${FieldLength});

TYPE strVarray IS VARRAY(#$FieldName) OF VARCHAR2(50);
--cshell数组变换成sqlplus的数组(项目名)
vFieldName strVarry := strVarray(${FieldName});

CURSOR csr(F_Key1 IN CHAR,
F_Key2 IN CHAR) IS
SELECT
${SelectField}
FROM
TABLE
WHERE
Key1 = F_Key1
AND
Key2 = F_Key2
;
RecCursor csr%rowtype;

TYPE t_FileArea IS RECORD(
F_Key1 CHAR(14),
F_Key2 CHAR(8),
);
FileArea t_FileArea;

--其它定义略

BEGIN
:rc :=0;
fpIn :=UTL_FILE.FOPEN('C:/test','input.dat','r',20);
fpOut :=UTL_FILE.FOPEN('C:/test','output.dat','w');

LOOP
BEGIN
UTL_FILE.GET_LINE(ftIn, RecInLine);
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXIT; --没有下条数据时exit
END;

FileArea.F_Key1 :=SUBSTRB(RecInLine, 2, 14);
FileArea.F_Key2 :=SUBSTRB(RecInLine,15, 8);

OPEN csr(F_Key1,F_Key2);
FETCH csr IN RecCursor;
RecOutLine :=RecInLine;
FOR i IN 1..$#SelectField LOOP
RecFront :=SUBSTRB(RecOutLine, 0,vFieldStart(i)-1);
RecBehind :=SUBSTRB(RecOutLine, vFieldStart(i) + vFieldLength(i));
RecOutLine :=RecFront || RecCursor.??? || RecBehind;

END LOOP;
CLOSE csr;
UTL_FILE.PUT_LINE(ftOut, RecOutLine);
END LOOP

EXCEPTION
--省略
END;

exit


以上代码实现的功能:
读入input.dat文件,在数据库中查询key一致的数据,将数据库中特定列的数据替换进文件的数据中,
然后输出到output.dat文件里。

我的问题是,在拼写字符串的时候,取数据库的项目的写法如何写?如果用cshell的数组,无法把i作为index传进去,可如果改用plsql的数组, RecCursor后面跟的项目名似乎又不允许用变量。
求高手帮帮忙。解决依次取数据库项目值的问题。

另外,跪求其他的更好的实现该功能的方法。
...全文
115 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
justkk 2010-09-29
  • 打赏
  • 举报
回复
sqlplus里面简单执行一个select语句呢,不要pl/sql块。
sqlplus user/password <<EOT
SELECT ${SelectField} FROM TABLE;
EOT

这样能否执行?
scfy926 2010-09-28
  • 打赏
  • 举报
回复
难道要变成死贴了?大家帮帮忙吧
justkk 2010-09-27
  • 打赏
  • 举报
回复
把你的数据库操作部分简化一下啊,那么长
你就先实现一个简单的select操作看看
scfy926 2010-09-27
  • 打赏
  • 举报
回复
不好意思,第一次做Cshell,做的一头雾水,只好上来求救了。
上面的程序简化成下面的样子:

# 查询数据库用select文
set SelectField = "C1,C2,C3,C4"

#sqlplus
sqlplus user/password <<EOT

DECLARE
CURSOR csr IS
SELECT
${SelectField}
FROM
TABLE;
RecCursor csr%rowtype;
--其它定义略

BEGIN
:rc :=0;
fpOut :=UTL_FILE.FOPEN('C:/test','output.dat','w');
OPEN csr;
FETCH csr IN RecCursor;
FOR i IN 1..$#SelectField LOOP
RecOutLine :=RecOutLine || RecCursor.???;
END LOOP;
CLOSE csr;
UTL_FILE.PUT_LINE(ftOut, RecOutLine);
END LOOP

EXCEPTION
--省略
END;

exit
steptodream 2010-09-26
  • 打赏
  • 举报
回复
楼上说的也是一种方法 可以试试
在shell里处理 在sql里使用shell里的变量
scfy926 2010-09-26
  • 打赏
  • 举报
回复
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

谢谢楼上的朋友帮忙顶!
Corepy 2010-09-26
  • 打赏
  • 举报
回复
掉下来,顶上去
scfy926 2010-09-26
  • 打赏
  • 举报
回复
掉下来,顶上去
justkk 2010-09-26
  • 打赏
  • 举报
回复
考虑在plsql中使用shell中的变量
拼凑一个取值的select语句,输出就可以了吧
scfy926 2010-09-26
  • 打赏
  • 举报
回复
下沉的真快,求达人啊
scfy926 2010-09-26
  • 打赏
  • 举报
回复
大虾们的意思不是太明白,可以说清楚一点吗?
最好能给个例子,谢谢啦!

23,114

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧