Гость
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SQLDA vs oracle / 9 сообщений из 9, страница 1 из 1
05.07.2004, 17:54
    #32590028
NewYear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLDA vs oracle
есть программка, написанная через SQLDA.
т.е. exec sql describe into *xx, и вперед, с песнями.
есть какой-нибудь шанс переделать ее на oracle?
...
Рейтинг: 0 / 0
05.07.2004, 20:16
    #32590231
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLDA vs oracle
Наверняка есть ;-).

Напишите поподробнее, что вам нужно (поскольку с Embedded SQL я не работаю), и я постараюсь подобрать эквивалент.
...
Рейтинг: 0 / 0
05.07.2004, 20:32
    #32590249
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLDA vs oracle
Бегло посмотрел доки по DESCRIBE, но ответить не могу, потому что не знаю, где вы им пользуетесь (пользовательская программа, SP), с какой целью (EXEC SQL DESCRIBE STMT1_NAME INTO :sqlda; EXEC SQL OPEN DYN_CURSOR; EXEC SQL FETCH DYN_CURSOR USING DESCRIPTOR :sqlda; - это не ответ), какая версия Oracle интересует.
...
Рейтинг: 0 / 0
05.07.2004, 20:33
    #32590250
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLDA vs oracle
Victor MetelitsaНаверняка есть ;-).

Напишите поподробнее, что вам нужно (поскольку с Embedded SQL я не работаю), и я постараюсь подобрать эквивалент.

Не эквивалент, а замену. Это огромная разница.
...
Рейтинг: 0 / 0
05.07.2004, 20:35
    #32590251
NewYear_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLDA vs oracle
есть у меня программка. написана на esql для db2. похоже, придется еще делать версию для oracle. пограммка работает с координатором, т.е. наверно, в oracle она должна быть на Pro *C (?). наверно, подправить statements / перекомпилировать не очень сложно...
но вот гадкий кусок кода. и таких гадких кусков много.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
void fetch(void) 
   {
    ............
    ...........

    EXEC SQL FETCH INSERTCUR USING DESCRIPTOR :*psqlda;  
    setcode();

    if(SQLCODE <  0 )
    {
      free_sqlda(psqlda);
      free(psqlda);   
      psqlda =  0 ;
      if(SQLCODE <  0 )
      {
        if(- 501 ==SQLCODE)
        {
          open();
        }
      }
      else
      throw SQLException("Insert:fetch()", SQLCODE, sqlca.sqlerrmc);
    }
    if(SQLCODE ==  100 )
    {
      return;
    }
    // 
    strcpy(szStatement , "INSERT INTO ");
       .........................
       .......................    
    
    strcat(szStatement, "(");
    char *p = szStatement;
    p += strlen(szStatement);


    {   
    for(int i =  0 ; i < psqlda->sqld; ++i)     
    {

       char szColname [  129  ];
       strncpy(szColname,psqlda->sqlvar.sqlname.data,
                psqlda->sqlvar[i].sqlname.length);
       szColname [psqlda->sqlvar[i].sqlname.length] = '\0';  

       char *pszTargetColname = 
             getTgtColname(szColname,
                           szTableName,
                           szTableOwner,
                           getApplyQual(),
                           getSetName()
                           );

      if(pszTargetColname== 0 )
      {
        charForBitData[i] = - 1 ;
        continue;
      }
      strcpy(p,pszTargetColname);
      p += strlen(p);
      strcat(p, ","); 
      p+=strlen(p);

    }
    }   
    if(p [- 1 ] == ',' ) { p[- 1 ] = '\0';  [i]--p; }
 
    strcat(p, ")");
    strcat(p, " VALUES(");
    p += strlen(p);

    for(int i =  0 ; i < psqlda->sqld; ++i)
    {

      unsigned short precision, scale, idx, point, bottom, ind;


      if( ((int)charForBitData) == - 1 ) continue;

      if (
        psqlda->sqlvar[i].sqltype &  1  && *(psqlda->sqlvar[i].sqlind) <  0 )
      {
         [i]/* the data in the sqlda is NULL */ 
        strcat(p, "NULL,"); p+=strlen(p);
      } else
      {
        switch(psqlda->sqlvar.sqltype)
        {
          // character
          case SQL_TYP_INTEGER: 
          case SQL_TYP_NINTEGER:
             sprintf(p, "%ld" , *(long*)psqlda->sqlvar[i].sqldata);
              p += strlen(p);
              *p++ = ',';
              *p   = '\0';

          break;
          case SQL_TYP_SMALL: 
          case SQL_TYP_NSMALL:
              sprintf(p, "%ld" , *(short*)psqlda->sqlvar[i].sqldata);
              p += strlen(p);
              *p++ = ',';
              *p   = '\0';

          break;
          case SQL_TYP_DECIMAL: 
          case SQL_TYP_NDECIMAL:
             
              precision = ((char *)& (psqlda->sqlvar[i].sqllen))[ 0 ]; 
              scale = ((char *)& (psqlda->sqlvar[i].sqllen))[ 1 ];     
                                                      
              if ((precision % 2 ) ==  0 )                
                precision +=  1 ;

              idx = (short)(precision +  2 ) /  2 ; 
              point = precision - scale;        

              bottom = * (psqlda->sqlvar[i].sqldata + idx - 1 ) 
                & 0x000F;    [i]/* sign */ 

              if ((bottom == 0x000D) || (bottom == 0x000B))
              {
                *p++ = '-'; *p= '\0';
              }

              for (ind =  0 ; ind < idx; ++ind)
              {
                short top = * (psqlda->sqlvar.sqldata + ind) 
                        & 0x00F0;
                top = (top >>  4 );
                bottom = * (psqlda->sqlvar[i].sqldata + ind) 
                        & 0x000F;
                if (point [i]-- == 0)
 
                {
                  *p++ = '.'; *p = '\0';
                }
                sprintf(p, "%d", top);
                p+=strlen(p);
                if (ind < idx -  1 )
                {
                  if (point -- == 0)
 
                  {
                   *p++ = '.'; *p = '\0';
                  }
                  sprintf(p, "%d", bottom);
                  p+=strlen(p);
               }
            }
              *p++ = ',';
              *p   = '\0';

          break;
          case SQL_TYP_FLOAT: 
          case SQL_TYP_NFLOAT:
             if(psqlda->sqlvar[i].sqllen== 8 )
             {
               sprintf(p, "%1.8e",  
                 *(double *)psqlda->sqlvar[i].sqldata);
             } else
             {
               sprintf(p, "%1.8e",  
                 *(float *)psqlda->sqlvar[i].sqldata);
             }

             p+=strlen(p);
             *p++ = ',';
             *p   = '\0';

          break;
         case SQL_TYP_CHAR: 
         case SQL_TYP_NCHAR:
            if(charForBitData[i] )
            {
               *p++ = '\'';
               for (int x=0; x<psqlda->sqlvar[i].sqllen ;++x)
               {
                 switch(psqlda->sqlvar[i].sqldata[x])
                 {
                   case '\'': *p++='\'';*p++= psqlda->sqlvar[i].sqldata[x];
                   *p = '\ 0 ';
                   break;
                  default:
                        *p++= ((char *)psqlda->sqlvar[i].sqldata)[x];
                        *p = '\ 0 ';
                   break;
                 }
               }
               // trim tailing spaces
               while(' ' == p[-1] ) --p; 
               *p++ = '\'';
               *p++ = ',';
               *p   = '\0';
              
            } else
            {
              *p++ = 'x';
              *p++ = '\'';
              for(int x=0;x< psqlda->sqlvar[i].sqllen;++x)
              {
                unsigned char ch = ((unsigned char *)
                    (psqlda->sqlvar[i].sqldata))[x];
                *p++ = "0123456789ABCDEF" [ (ch >> 4) & 0x0F ];
                *p++ = "0123456789ABCDEF" [ (ch >> 0) & 0x0F ];
              }
              *p++= '\'';
              *p++ = ',';
              *p   = '\0';
            }
           break;
           case SQL_TYP_DATE:      
           case SQL_TYP_NDATE:
               strcat(p,"DATE("); p+=strlen(p);
               *p++ = '\'';
               {
               for (int x=0; x<psqlda->sqlvar[i].sqllen ;++x)
               {
                 *p++= psqlda->sqlvar[i].sqldata[x];
               }
               }
               // trim tailing spaces
               *p++ = '\'';
               *p++ = ')';
               *p++ = ',';
               *p   = '\0';
           break;
           case SQL_TYP_TIME:      
           case SQL_TYP_NTIME:     
               strcat(p,"TIME("); p+=strlen(p);
               *p++ = '\'';
               {
               for (int x=0; x<psqlda->sqlvar[i].sqllen ;++x)
               {
                 *p++= psqlda->sqlvar[i].sqldata[x];
               }
               }
               // trim tailing spaces
               *p++ = '\'';
               *p++ = ')';
               *p++ = ',';
               *p   = '\0';
              
           break;
           case SQL_TYP_STAMP:
           case SQL_TYP_NSTAMP:
               *p++ = '\'';
               {
               for (int x=0; x<psqlda->sqlvar[i].sqllen ;++x)
               {
                 *p++= psqlda->sqlvar[i].sqldata[x];
               }
               }
               // trim tailing spaces
               *p++ = '\'';
               *p++ = ',';
               *p   = '\0';
           break;
           case SQL_TYP_CSTR:
           case SQL_TYP_NCSTR:
               if(charForBitData[i])
               {
                 *p++ = 'x';
                 *p++ = '\'';
                 int count = 0;
                 for(int x=0;x<psqlda->sqlvar[i].sqllen;++x)
                 {
                   if( 254 <= count )
                   { 
                     count = 0;
                     strcat(p, "' CONCAT x'");
                     p += strlen(p);
                   }

                   unsigned char ch = 
                       ((unsigned char *)(psqlda->sqlvar[i].sqldata))[x];
                   *p++ = "0123456789ABCDEF" [ (ch >> 4) & 0x0F ];
                   *p++ = "0123456789ABCDEF" [ (ch >> 0) & 0x0F ];                   
                 }
                 *p++ = '\'';
               } else
               {
                 *p++ = '\'';
                 *p = '\ 0 ';
                 int count = 0;
                 for(int x=0;x<psqlda->sqlvar[i].sqllen;++x)
                 {
					if( 253 <= count )
					{ 
						count = 0;
						strcat(p, "' CONCAT '");
						p += strlen(p);
					}
                   ++count;
                   switch(  ((char*)psqlda->sqlvar[i].sqldata) [x])
                   {
						case '\ 0 ':  x = psqlda->sqlvar[i].sqllen;
		                  break;
                  case '\'': *p++='\'';
                   *p++= ((char*)psqlda->sqlvar[i].sqldata)[x]; 
                   *p = '\ 0 '; ++count;
                  break;
                  default:
                        *p++= ((char*)psqlda->sqlvar[i].sqldata)[x];
                         *p = '\ 0 ';
                  break;
                   } 
                 } 
                 *p++ = '\'';                 
                 *p =   '\0';
               }
               *p++ = ',';
               *p   = '\0';
           break;
        } 
     }
    }
          ........................
          .........................
    } 
...
Рейтинг: 0 / 0
05.07.2004, 20:42
    #32590257
NewYear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLDA vs oracle
использую fetch cursor, describe cursor, describe statement ...
проблема в том, что sqlda - то, наверно, разные.

что-то не получилось залогиниться.
...
Рейтинг: 0 / 0
05.07.2004, 21:54
    #32590286
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLDA vs oracle
Ммддаа...

Правильно я понимаю, что это длиннющий крутой сишный код выше заменяет банальное
insert into xxx
select ... from yyy
?

Вместо него открывают курсор на select ... from yyy, потом делают describe, реконструируют insert и выполняют?
...
Рейтинг: 0 / 0
05.07.2004, 22:43
    #32590315
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLDA vs oracle
Что-то смахивающее на дельфийское TQuery. Суют произвольный SELECT-запрос, а компонент реконструирует INSERT/UPDATE/DELETE...

Короче, в главке Oracle "Dynamic SQL" руководства "Pro*C/C++ Precompiler Programmer's Guide. Release 8.1.6" я вижу практически тот же DESCRIBE (синтаксис чуть отличается, но это непринципиально) и SQLDA.
...
Рейтинг: 0 / 0
06.07.2004, 13:10
    #32591209
NewYear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLDA vs oracle
это длиннющий крутой сишный код в самом деле
делает банальный select * from table, и из каждой считанной строчки формирует statement
insert into table, эквивалентный считанной строке.

TQuery тут вряд ли сгодится - он не будет работать на мейнфрейме и OS/400...

>Короче, в главке Oracle "Dynamic SQL" руководства "Pro*C/C++ Precompiler >Programmer's Guide. Release 8.1.6" я вижу практически тот же DESCRIBE (синтаксис чуть отличается, но это непринципиально) и SQLDA.

хорошо, что так :)
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SQLDA vs oracle / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]