在c#中如何向oracle传递大于32767的字符串?

时间:2022-09-11 07:55:57
在c#中如何向oracle传递大于32767的字符串?多谢指点!

20 个解决方案

#1


怎么没人说话啊?

#2


没意思,放假啦,也没人来论坛。

#3


varchar2的长度限制是4000。可以考虑用可变数组。

#4


不明白,能详细说明吗?多谢指点!

#5


好静啊!

#6


自己顶!

#7


路过

#8


用 CLOB 类型的字段来存储大于 4000 字节的字符串数据。

#9


多谢 飞不起来的笨鸟指点,我试过CLOB,但只能接收小于32767的字符串。

#10


有路过多谢帮我顶啊!

#11


clob可以存最大8T的字节。你如果不能存,肯定是你使用方法错了。

#12


那就用两个变量接,然后拼接起来。o(∩_∩)o...

#13


我知道mssql里有nvarchar(max)类型

#14


学习甲骨文,你好,多谢!你说:clob可以存最大8T的字节。你如果不能存,肯定是你使用方法错了。
也学是我的方法不对,麻烦你帮我看一下如何改进:
1、在oracle中有一个procedure:
   PROCEDURE GET_MSG (
      RECEIVED_MSG   IN       CLOB
   )
   IS
      INSERT_STR       VARCHAR2 (32767) := '';
      LOB_LEN          NUMBER;
      CUR_LOB_LEN      NUMBER;
      V_POS            NUMBER           := 1;
      J                INTEGER;
      J_LOOP           INTEGER;

      BEGIN
     
      LOB_LEN := DBMS_LOB.GETLENGTH (RECEIVED_MSG);
      J := CEIL (LOB_LEN / 32767);

      FOR J_LOOP IN 1 .. J
      LOOP
         CUR_LOB_LEN := LOB_LEN - (J - 1) * 32767;
         V_POS := V_POS + (J_LOOP - 1) * 32767;
         DBMS_LOB.READ (RECEIVED_MSG, CUR_LOB_LEN, V_POS, INSERT_STR);
         。。。 。。。
      END LOOP;
     end;
2、在c#中定义一个string类型的变量,直接将该变量的值传递给RECEIVED_MSG ,当c#中的string变量超过32513时,就会报错:
ORA-01460: 转换请求无法实现或不合理\n
  我好晕啊,不知道32513到底代表什么,只要超过32513就抱错,指点指点我吧,快两天啦,没有一点进展。

#15


路过帮我顶啊!

#16


别的不说,你这个过程里:
 INSERT_STR      VARCHAR2 (32767) := ''; 
这个就错了。varchar2最大长度4000byte

#17


INSERT_STR      VARCHAR2 (32767) := ''; 
应该不错,varchar2最大长度4000byte是指表中的字段,变量最大是32768,即32k。

#18


恩。varchar2字段和变量最大长度不同。还没注意过这个问题。
你这样试试,别的都不改,把RECEIVED_MSG这个传入参数的类型改为clob试试,不用varchar2。

#19


说错了,是INSERT_STR变量。

#20


应该不行,你就别等啦,没答案的。
因为dbm_lob只能处理小于32k字符,你只好用两个clob接收大于32k的字符串,然后分别处理。

#1


怎么没人说话啊?

#2


没意思,放假啦,也没人来论坛。

#3


varchar2的长度限制是4000。可以考虑用可变数组。

#4


不明白,能详细说明吗?多谢指点!

#5


好静啊!

#6


自己顶!

#7


路过

#8


用 CLOB 类型的字段来存储大于 4000 字节的字符串数据。

#9


多谢 飞不起来的笨鸟指点,我试过CLOB,但只能接收小于32767的字符串。

#10


有路过多谢帮我顶啊!

#11


clob可以存最大8T的字节。你如果不能存,肯定是你使用方法错了。

#12


那就用两个变量接,然后拼接起来。o(∩_∩)o...

#13


我知道mssql里有nvarchar(max)类型

#14


学习甲骨文,你好,多谢!你说:clob可以存最大8T的字节。你如果不能存,肯定是你使用方法错了。
也学是我的方法不对,麻烦你帮我看一下如何改进:
1、在oracle中有一个procedure:
   PROCEDURE GET_MSG (
      RECEIVED_MSG   IN       CLOB
   )
   IS
      INSERT_STR       VARCHAR2 (32767) := '';
      LOB_LEN          NUMBER;
      CUR_LOB_LEN      NUMBER;
      V_POS            NUMBER           := 1;
      J                INTEGER;
      J_LOOP           INTEGER;

      BEGIN
     
      LOB_LEN := DBMS_LOB.GETLENGTH (RECEIVED_MSG);
      J := CEIL (LOB_LEN / 32767);

      FOR J_LOOP IN 1 .. J
      LOOP
         CUR_LOB_LEN := LOB_LEN - (J - 1) * 32767;
         V_POS := V_POS + (J_LOOP - 1) * 32767;
         DBMS_LOB.READ (RECEIVED_MSG, CUR_LOB_LEN, V_POS, INSERT_STR);
         。。。 。。。
      END LOOP;
     end;
2、在c#中定义一个string类型的变量,直接将该变量的值传递给RECEIVED_MSG ,当c#中的string变量超过32513时,就会报错:
ORA-01460: 转换请求无法实现或不合理\n
  我好晕啊,不知道32513到底代表什么,只要超过32513就抱错,指点指点我吧,快两天啦,没有一点进展。

#15


路过帮我顶啊!

#16


别的不说,你这个过程里:
 INSERT_STR      VARCHAR2 (32767) := ''; 
这个就错了。varchar2最大长度4000byte

#17


INSERT_STR      VARCHAR2 (32767) := ''; 
应该不错,varchar2最大长度4000byte是指表中的字段,变量最大是32768,即32k。

#18


恩。varchar2字段和变量最大长度不同。还没注意过这个问题。
你这样试试,别的都不改,把RECEIVED_MSG这个传入参数的类型改为clob试试,不用varchar2。

#19


说错了,是INSERT_STR变量。

#20


应该不行,你就别等啦,没答案的。
因为dbm_lob只能处理小于32k字符,你只好用两个clob接收大于32k的字符串,然后分别处理。

#21