Oracle修改全局临时表

时间:2019-02-21 02:12:37

标签: oracle oracle12c

https://community.oracle.com/message/15070384#15070384

问候亲爱的社区。

当我们尝试更改全局临时表的DDL时。即使是很久以前的会议,它也让我们无法接受。

这是一个错误吗?

我们在需要非常长时间的繁琐交易应用上使用GTT。

因此,实际上,如果一直发生这种情况,我们就会遇到问题。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char* ReadFile(char *filename)
{
char *buffer = NULL;
int string_size, read_size;
FILE *handler = fopen(filename, "r");

if (handler)
{
   // Seek the last byte of the file
    fseek(handler, 0, SEEK_END); 
 // Offset from the first to the last byte, or in other words,filesize
   string_size = ftell(handler);
   // go back to the start of the file
   rewind(handler);

   // Allocate a string that can hold it all
   buffer = (char*) malloc(sizeof(char) * (string_size + 1) );

   // Read it all in one operation
   read_size = fread(buffer, sizeof(char), string_size, handler);

   // fread doesn't set it so put a \0 in the last position
   // and buffer is now officially a string
   buffer[string_size] = '\0';

   if (string_size != read_size)
   {
       // Something went wrong, throw away the memory and set
       // the buffer to NULL
       free(buffer);
       buffer = NULL;
   }

    // Always remember to close the file.
    fclose(handler);
    return buffer;
 }

 return NULL;
 }
int newLineCounter(char *string)
{
if(string==NULL)
return -1;
int count=0;
for(int i=0;((string[i])!='\0');i++)
{
  if(string[i]=='\n')
  count++;
}
return count;
}

char ** arrayOfWords(char *str,int max)
{
  char **s;
  s=malloc(max*(sizeof(char *)+1));
  if(str==NULL||max<0)
  return NULL;
  int count=0;
  char *temp=strtok(str,"\n");
  int size=strlen(temp);
  s[0]=malloc((sizeof(char *)*(size+1)));
  s[0]=temp;
  // int count=0;
  while((s!=NULL)&&(count<max-1))
  {
   count++;
   char *temp=strtok(NULL,"\n");
   int size=strlen(temp);
   s[count]=malloc((sizeof(char *)*(size+1)));
   s[count]=temp;
  }
  count++;
  s[count]="\0";

  return s;
 }




int main()
{
    char *string = ReadFile("hi.txt");
    if(string==NULL) {
    printf("%s\n","Error,no files here" );
    }
  else {


int newLines=newLineCounter(string);
char **ret=arrayOfWords(string,newLines);
for(int i=0;i<newLines;i++)
{
printf("%s\n",ret[i] );
}
for(int i=0;i<newLines;i++)
{
free((ret[i]));
}

 free(ret);

 }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

全局临时表不应经常删除,创建或更改。全局临时表可以被许多不同的会话访问,它们只需创建一次。 数据对于每个会话都是私有的,但是 object 不是私有的。

(使用“一直在发生”这一短语使我相信您正在不断删除并重新创建全局临时表。如果不是这种情况,请更新问题。)

如果要创建一个会话专用的临时表,则要使用18c中引入的专用临时表。

如果您确实需要不断删除全局临时表(也许作为自动删除并重新创建所有内容的模式部署的一部分,尽管这听起来不像是适用于生产的过程),则可能需要查看一下我的Oracle支持文档“如何在删除临时表期间诊断ORA-14452(文档ID 800506.1)”中的说明。该文档的要旨是:找到所有相关的会话并杀死它们(这在生产中可能也是个坏主意。)