Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 在循环期间重新初始化PL/SQL中的变量/记录_Loops_Plsql_Io - Fatal编程技术网

Loops 在循环期间重新初始化PL/SQL中的变量/记录

Loops 在循环期间重新初始化PL/SQL中的变量/记录,loops,plsql,io,Loops,Plsql,Io,为了为ETL过程创建PL/SQL解析器(其中数据主要是位置编码的),我需要逐行读取文件,并将记录添加到内存(包范围)表中的当前记录或新记录中 让我简要地解释一下场景和语法规则:我需要解析银行对齐消息,该消息具有公共标准格式(找不到英语文档,只能找到其他意大利语文档,而这应该是欧盟范围的标准)。无论如何,这里有一些规则解释: 文件中的每条记录长度为120个字符 每个文件都以“AL”(对齐)记录开始 每个文件都以en“EF”(文件结束)记录结尾 每个对齐信息以“12”记录开始,以“70”记录结束

为了为ETL过程创建PL/SQL解析器(其中数据主要是位置编码的),我需要逐行读取文件,并将记录添加到内存(包范围)表中的当前记录或新记录中

让我简要地解释一下场景和语法规则:我需要解析银行对齐消息,该消息具有公共标准格式(找不到英语文档,只能找到其他意大利语文档,而这应该是欧盟范围的标准)。无论如何,这里有一些规则解释:

  • 文件中的每条记录长度为120个字符
  • 每个文件都以“AL”(对齐)记录开始
  • 每个文件都以en“EF”(文件结束)记录结尾
  • 每个对齐信息以“12”记录开始,以“70”记录结束
  • 根据“12”记录的类型,消息可以由其他记录的不同组合组成,如“30”和“40”、“50”、“45”、“50”和“45”、“50”
示例(结构化):

我已经声明了一个
MESSAGE
PL/SQL表,该表包含
CHAR(120)
,它将封装12到70之间的记录(包括在内),这些记录将在稍后阶段处理。现在我有一个循环问题,可以用Java轻松解决

如何在PL/SQL中重新初始化变量?下面是一个伪Java示例,说明了我需要做的事情

String line;
List<String> alignment_message;
List<AlignmentMessage> table;
while (line = readline()) {
    if (line.substring(1,2)=="12") //Begin of message 
        alignment_message = new MESSAGE(); //******HOW DO I DO THIS????
    alignment_message.add(line); //Don't care about NPE ;-)

    if (line.substring(1,2)=="70") //End of message
        table.add(alignment_message);
}
字符串行;
列出你的信息;
列表表;
while(line=readline()){
if(line.substring(1,2)=“12”)//消息的开头
alignment_message=new message();//****我该怎么做????
对齐_message.add(line);//不关心NPE;-)
if(line.substring(1,2)=“70”)//消息结束
表.添加(对齐信息);
}
我目前已经在PL/SQL过程中声明了类型为
MESSAGE
的变量
msg
。如果我将
INSERT
插入此变量,然后将
INSERT
此变量插入包含
MESSAGE
类型的列(以及我用于预处理的其他两列)的表中,我如何在freshnew msg变量中执行新的
INSERT
操作


谢谢

如果您将
消息
声明为
字符表(120)
字符表(120)按二进制整数值索引
字符表(120)
,那么您就可以这样做了

msg.DELETE;
嵌套表、按表索引和varray上的方法从中删除所有元素

当您在表中插入
msg
时,Oracle似乎存储了它的副本,而不是对它的引用。从
msg
中删除所有元素不会导致表中的数据突然消失

或者,如果
MESSAGE
是CHAR(120)的
表或CHAR(120)
VARRAY(…),则可以调用
MESSAGE()
构造函数,即

msg := MESSAGE();

如果您已将
消息
声明为
字符表(120)
字符表(120)按二进制整数索引
字符表(120)
,则可以执行以下操作:

msg.DELETE;
嵌套表、按表索引和varray上的方法从中删除所有元素

当您在表中插入
msg
时,Oracle似乎存储了它的副本,而不是对它的引用。从
msg
中删除所有元素不会导致表中的数据突然消失

或者,如果
MESSAGE
是CHAR(120)的
表或CHAR(120)
VARRAY(…),则可以调用
MESSAGE()
构造函数,即

msg := MESSAGE();
start of a block
end of a block
aligment message: 40 record
start of a block
end of a block
aligment message: 50 record
aligment message: 51 record