배열 포인터

#include <stdio.h>

void func1(int *p){
	for(int i=0;i<5;i++){
		printf("%d, ",p[i]);
	}
	printf("\n");
}
void func2(int p[2][5]){
	for(int i= 0;i<2;i++){
		for(int k=0;k<5;k++){
			printf("%d, ",p[i][k]);
		}
		printf("\n");
	}
}
void func3(int (*p)[5]){
	for(int i=0;i<2;i++){
		for(int j=0;j<5;j++){
			printf("%d, ", p[i][j]);
		}
		printf("\n");
	}
}

int main(){
	int array[2][5]={
			{1,2,3,4,5},
			{6,7,8,9,10}
	};
	func1(array[0]);//1,2,3,4,5
	func1(array[1]);//6,7,8,9,10
	func2(array);
	func2(&array[0]);
	func3(array);
	func3(&array[0]);
	return 0;
}


 

문자배열 포인터

#include <stdio.h>

void printStr(char * pstr){
	while(*pstr != 0){
		printf("%c",*pstr);
		pstr++;
	}
	printf("\n");
}
int main(){
	char str[]="Hello C~";
	printStr(str);

	char* pstr = str;

	printStr(pstr);
	printStr(&str[0]);
	printStr(&str[5]);
	pstr[5]=0;
	printStr(str);
	return 0;
}



구조체
사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수있는 사용자 정의 타입이다.
구조체 안에 선언된 변수 순서에 맞춰 초기값을 부여해야 한다.

typedef struct name{
} ss; 
를 이용하면 struct 를 사용하지 않고 변수 선언을 할 수 있다.

#include <stdio.h>

struct Person{
	char name[30];
	char gender;
	int age;
	char addr[50];
};

int main(){

	//1 순서에 맞춰 초기화
	struct Person p1={"홍길동",'M',22,"서울 영등포구 당산동"};
	//2 .을 이용해서 초기화
	struct Person p2={.name="김길동", .addr="서울 마포구", .age=23, .gender='F'};

	printf("%s %c %d %s\n",p1.name ,p1.gender,p1.age,p1.addr);
	printf("%s %c %d %s\n",p2.name ,p2.gender,p2.age,p2.addr);

	struct Person p3;
	strcpy(p3.name,"최길동");

	return 0;
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>

typedef struct Book{
	char title[30];
	char author[30];
	int price;
} mybook;

//const 를 이용하면 읽기 전용으로 만들 수 있다.
void print_book(mybook* const b){
	printf("도서 제목: %s\n",b->title);
	printf("저      자: %s\n",b->author);
	printf("가      격: %d\n",b->price);
}

void print_book2(mybook* const b){
	printf("도서 제목: %s\n",(*b).title);
	printf("저      자: %s\n",(*b).author);
	printf("가      격: %d\n",(*b).price);
}

int main(){

	mybook b1={"C언어 기초", "김작가", 25000};

	print_book(&b1);
	print_book(&b1);
	return 0;
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>

typedef struct s1{
	char movieName[40];
	int time;
	int age;
	int price;
} movie;

void print_movie(movie* const t){
	printf("%s %d %d %d\n",t->movieName,t->time,t->age,t->price);
}

void print_movie2(movie* const t){
	for(int i=0;i<2;i++){
		printf("%s %d %d %d\n",(t+i)->movieName,(t+i)->time,(t+i)->age,(t+i)->price);
	}
}
void print_movie3(movie m[2]){
	for(int i=0;i<2;i++){
		printf("%s %d %d %d\n",m[i].movieName,m[i].time,m[i].age,m[i].price);
	}
}

int main(){

	movie b1={"라붐",13,15,8000};
	movie b2={"라붐2",15,18,12000};

	print_movie(&b1);
	print_movie(&b2);

	movie myArr[2]={
			b1,b2
	};
	print_movie2(myArr);
	print_movie3(myArr);
	return 0;
}



 

인덱스
테이블 값을 빠르게 접근하도록 하는 데이터베이스 객체

인덱스 생성
CREATE INDEX 인덱스명 ON 테이블명 (컬럼명1 [, 컬럼명2] );
주의: 인덱스는 NOT NULL인 컬럼에만 사용할 수 있다. NULL인 경우는 인덱스를 정렬할 수 없기 떄문에 사용 불가능

--MEMEBER테이블에서 검색에 자주 사용되는 컬럼에 대해 인덱스를 생성하세요

CREATE INDEX MEMBER_NAME_IDX ON MEMBER (NAME)

 

--상품 테이블에서 인덱스를 걸면 좋을 컬럼을 찾아 인덱스를 생성하세요

CREATE INDEX PRODUCTS_CATEGORY_FK_IDX ON PRODUCTS(CATEGORY_FK);

CREATE INDEX PRODUCTS_EP_CODE_FK_IDX ON PRODUCTS(EP_CODE_FK);

select * from user_objects
where object_type='INDEX';

select * from user_indexes
where table_name = 'PRODUCTS';

인덱스 수정 X
인덱스를 삭제한 뒤 다시 생성한다.

인덱스 삭제
DROP INDEX 인덱스명;

DROP INDEX PRODUCTS_EP_CODE_FK_IDX;

시스템 권한 (System Privileges) 

 오라클에서 권한(Privilege)은 특정 타입의 
 SQL문을 실행하거나 데이터베이스나 데이터 베이스
 객체에 접근할 수 있는 권리입니다.

SYSTEM PRIVILEGES

 - 시스템 권한은 사용자가 데이터베이스에서 
   특정 작업을 수행 할 수 있도록 합니다
 - 약 126개의 시스템 권한이 있으며 그 수는 
   계속 증가하고 있습니다. 
 - 권한의 ANY 키워드는 사용자가 모든 스키마에서 
   권한을 가짐을 의미 합니다.
 - GRANT 명령은 사용자 또는 Role에 대해서 권한을 
   부여 합니다. 
 - REVOKE 명령은 권한을 삭제 합니다. 

대표적인 시스템 권한     

  -  CREATE SESSION : 
     데이터 베이스를 연결할 수 있는 권한
  -  CREATE ROLE : 
    오라클 데이터베이스 역할을 생성할 수 있는 권한
  -  CREATE VIEW : 뷰의 생성 권한
  - CREATE TABLE: 테이블 생성 권한
  - CREATE SEQUENCE: 시퀀스 생성 권한
  -  ALTER USER : 생성한 사용자의 정의를 변경할 수 있는 권한
  -  DROP USER : 생성한 사용자를 삭제시키는 권한시스템 권한의 종류 몇가지

시스템 권한 부여 문법(Syntax)

GRANT [system_privilege| role] TO [user|role|PUBLIC]
[WITH ADMIN OPTION]

 - system_privilege : 부여할 시스템 권한의 이름
 - role : 부여할 데이터베이스 역할의 이름
 - user, role : 부여할 사용자 이름과 다른 데이터 베이스 역할 이름
 - PUBLIC : 시스템 권한, 또는 데이터베이스 역할을 모든 사용자에게 부여할 수 있습니다.
 - WITH ADMIN OPTION : 권한을 부여 받은 사용자도 부여 받은 권한을 다른 사용자 또는 역할로 부여할 수 있게 되며, 
   만약 사용자가 WITH ADMIN OPTION과 같이 역할을 부여 받는다면 부여된 역할은 그 사용자에 의해 변경  또는 삭제 될 수 있습니다. 

 시나리오.
 1. DBA권한을 가진 SYSTEM으로 접속
 2. 새로운 사용자를 생성 MILLER USER를 생성하고 비번 지정
 3. MILLER로 접속 시도  -> 권한 부족
 4. SYSTEM으로 접속하여 MILLER에게 CREATE SESSION 권한 부여
 5. MILLER로 접속 시도 --> 성공
 6. TEST 테이블 생성하기 --> 권한 부족
 7. SYSTEM으로 접속 후 테이블 생성 권한 부여
 8. 다시 테이블 생성후 레코드 insert
 9. tablespace에 대한 권한 부족이라고 나옴
 10. system으로 접속후 MILLER의 테이블 스페이스 확인

SELECT USERNAME, DEFAULT_TABLESPACE FROM DBA_USERS
WHERE USERNAME='MILLER'

테이블 스페이스는 테이블과 뷰 등 데이터베이스 객체들이 저장되는 장소.
USERS는 사용자 데이터를 저장하기 위한 공간.

CREATE TABLE권한을 줬음에도 테이블을 생성하지 못하거나 INSERT
하지 못한 것은 사용자 생성 당시 해당 디폴트 테이블스페이스인 USERS
에 대한 QUOTA를 설정하지 않았기 때문.

11. SYSTEM 접속 후 테이블스페이스 영역 할당하기
ALTER USER MILLER QUOTA 2M ON USERS

QUOTA절을 이용하여 MILLER사용자가 사용할 테이블스페이스 영역을
할당했으므로 다시 MILLER로 접속하여 시도해보자.

--1
sqlplus
--2
system/Abcd1234
--3
create user miller
idendified by 12;
--4
grant create session to miller
--5
grant create table to miller
--6
grant alter user miller quota 2M ON system;
--7
create table test(
	num	number(3)
);

 

+ Recent posts