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

Напишите поподробнее, что вам нужно (поскольку с Embedded SQL я не работаю), и я постараюсь подобрать эквивалент.
...
Рейтинг: 0 / 0
SQLDA vs oracle
    #32590249
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бегло посмотрел доки по 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
SQLDA vs oracle
    #32590250
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor MetelitsaНаверняка есть ;-).

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

Не эквивалент, а замену. Это огромная разница.
...
Рейтинг: 0 / 0
SQLDA vs oracle
    #32590251
NewYear_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть у меня программка. написана на 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
SQLDA vs oracle
    #32590257
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
использую fetch cursor, describe cursor, describe statement ...
проблема в том, что sqlda - то, наверно, разные.

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

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

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

Короче, в главке Oracle "Dynamic SQL" руководства "Pro*C/C++ Precompiler Programmer's Guide. Release 8.1.6" я вижу практически тот же DESCRIBE (синтаксис чуть отличается, но это непринципиально) и SQLDA.
...
Рейтинг: 0 / 0
SQLDA vs oracle
    #32591209
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это длиннющий крутой сишный код в самом деле
делает банальный 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
9 сообщений из 9, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SQLDA vs oracle
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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