26 Ağustos 2008 Salı

Datatypes for SQL and PL/SQL, Numbers

Original Text: http://it.toolbox.com/blogs/oracle-guide/learn-oracle-datatypes-for-sql-and-plsql-numbers-10673

Datatypes are a subject that confuses many people. There are many types and many sub-types. A type is a basic datatype like NUMBER. A sub-type is derived from a type. An INTEGER is a sub-type of NUMBER. A sub-type usually add a constraint to a type and that creates the new sub-type; for INTEGER, only whole numbers are allowed.

In 10g, the five numeric types that you will most commonly use are: NUMBER, PLS_INTEGER, BINARY_INTEGER, BINARY_FLOAT and BINARY_DOUBLE. You would declare and use any of these in the same manner, although the BINARY_FLOAT and BINARY_DOUBLE add a few extra features that I cover below.


NUMBER

NUMBER, as you might have guessed, stores numeric data. There aren't any differences between the SQL type NUMBER and the PL/SQL type NUMBER. A NUMBER can store 38 digits of precision. A fully populated NUMBER requires 22 bytes to store. That's a very large number. You can constrain a NUMBER to limit the size of the values it can store.

NUMBER(precision,scale) defines how precise the number can be (think of it as how many digits it can be ) and what the scale can be (think of scale as how small it can be).

Both precision and scale are optional in a NUMBER declaration. You can declare a NUMBER with a precision and no scale but if you define a scale, you must define a precision.

You can also declare a negative scale. A negative scale will round up to the number of digits specified.

Let's see some examples:

DECLARE
a NUMBER;
b NUMBER(5);
c NUMBER(5,0);
d NUMBER(2,3);
e NUMBER (5,3);
f NUMBER(5,-2);
BEGIN
a := 1; -- No error, no rounding
a := 1000; -- No error, no rounding
a := 10000000; -- No error, no rounding
a := 100000000000000000000000000; -- No error, no rounding
a := 100000000000000000000000000.1; -- No error, no rounding

b := 1; -- No error, no rounding
b := 1.1; -- rounded to 1
b := 123.1; -- rounded to 123
b := 123.1234; -- rounded to 123
b := 123.9999; -- rounded to 124
b := 12345.123456; -- rounded to 12345
-- Precision is 5,
-- It's ok to be bigger than 5 on the right
b := 123456.1111; -- This gets an error
-- Can't be bigger than 5 digits to the left

-- c is implicitly defined exactly the same as b
c := 1; -- No error, no rounding
c := 1.1; -- rounded to 1
c := 123.1; -- rounded to 123
c := 123.1234; -- rounded to 123
c := 12345.123456; -- rounded to 12345
c := 12345.999999; -- rounded to 12346
c := 123456.1111; -- This gets an error
-- Can't be bigger than 5 digits to the left

-- d the scale is larger than the precision
-- it can only hold a number smaller than 2 significant digits

d := .012345; -- rounded to .012
d := 1.012345; -- This is an error, scale less than precision
-- means less than 1
d := .112345; -- This is an error
-- Precision is less

e := 1; -- No error, no rounding
e := 1.1; -- No error, no rounding
e := 12.1; -- No error, no rounding
e := 12.12; -- No error, no rounding
e := 12.123; -- No error, no rounding
e := 123.1234; -- Error, .1234 to large
e := 12345.123; -- Error, 12345 too large

f := 1; -- rounded to 0
f := 10; -- rounded to 0
f := 100; -- No error, no rounding
f := 100.001; -- rounded to 100
f := 9999.9999; -- rounded to 10000
f := 9999999; -- Error, too large

END;
You can use NUMBER as a table datatype and in your programs. Constrain your number with a precision and scale when your data rules call for it.

PLS_INTEGER and BINARY_INTEGER

PLS_INTEGER and BINARY_INTEGER are identical data types and are only available in PL/SQL. You cannot create a column in a table with either of these data types. PLS_INTEGER is a highly efficient integer 32-bit data type. You will most commonly see PLS_INETGER (and BINARY_INETGER) in PL/SQL routines as an index variable. An associative array (INDEX BY TABLE) index. Both PLS_INTEGER and BINARY_INTEGER allow whole numbers only. Decimal fractions are rounded to the nearest whole number.

There performance benefits to using PLS_INTEGER or BINARY_INTEGER is some places (as opposed to a NUMBER). Those performance issues are beyond the scope of this article, but if you would like to read about it, do a web search on "performance pls_integer oracle" and read some of the articles.

There's not much more to say about these two types. In 10g, they are interchangeable and the primary place to use them is in computing intensive PL/SQL code.

BINARY_FLOAT and BINARY_DOUBLE

These two data types are provided to allow very efficient floating point operations. BINARY_FLOAT is 32 bit and BINARY_DOUBLE is 64 bit.

There are two special cases (three including a negative) for these datatypes can be tested: Not a Number (NaN) and infinity (INF) (and negative infinity -INF). You can test for INF and NaN using IS or IS NOT, as in: SELECT * FROM TAB WHERE float_field IS NaN.

While these two data types are more efficient, they are less precise than a regular NUMBER datatype.

Sub-Types

Here are the STANDARD sub-types defined in Oracle 10g (taken from the STANDARD package):


type NUMBER is NUMBER_BASE;
subtype FLOAT is NUMBER; -- NUMBER(126)
subtype REAL is FLOAT; -- FLOAT(63)
subtype "DOUBLE PRECISION" is FLOAT;
subtype INTEGER is NUMBER(38,0);
subtype INT is INTEGER;
subtype SMALLINT is NUMBER(38,0);
subtype DECIMAL is NUMBER(38,0);
subtype NUMERIC is DECIMAL;
subtype DEC is DECIMAL;

subtype BINARY_INTEGER is INTEGER range '-2147483647'..2147483647;
subtype NATURAL is BINARY_INTEGER range 0..2147483647;
subtype NATURALN is NATURAL not null;
subtype POSITIVE is BINARY_INTEGER range 1..2147483647;
subtype POSITIVEN is POSITIVE not null;
subtype SIGNTYPE is BINARY_INTEGER range '-1'..1;
That's about it for the numeric data types. If you understand NUMBER you're pretty much covered. It's important to understand the scale and precision parameters to a NUMBER declaration. Play with the code above.

There is no right or wrong about setting your scale or precision. If a number must be limited (due to business requirements), set the limits at the database level.

If you are tuning a PL/SQL program, remember PLS_INTEGER and BINARY_INTEGER are potentially faster than a regular NUMBER. Also remember that the Binary Float types may also be faster but are not as precise.

I will cover the Oralce provided numeric functions, including SQL, conversions & format masks, in a future article.

Take care,

LewisC

Listen to my latest podcast where I discuss RAC and Grid with experts Philip Newlan and Scott Jesse of Oracle - download it here.

Veritabanı ve Oracle İçin Temel Terim ve Bilgiler...

Kaynak:http://www.findikkurdu.com/Article.aspx?ID=24


Söze başlamadan önce Oracle konusunda uzman olmadığımı belirtmek istiyorum. Bir programcının bilmesi gereken temel şeyleri biliyorum sadece. Oracle konusunda uzmanlaşmak istediğim için bu sitede Oracle bölümünü ben üstlendim. Karşılıklı sorular ve ihtiyaçlar doğrultusunda hep birlikte oracle öğreneceğimizi düşünüyorum.

Öncelikle kısaca Veritabanı ve Oracle ile ilgili temel bilgileri aktarmak istiyorum.

Belirli bir tarzda oluşturulmuş bilgi topluluğuna veritabanı diyoruz. Bir veritabanı en az bir tablodan , ve her tablo kendi içinde verilerin tutulduğu veri alanları (Data Field)´ndan oluşur.

Satır ve sütunlar tarafıdan meydana gelen birden fazla tablonun oluşturduğu, tabloların birbirleri yerine kullanılabidiği ve aralarında ortak alanların bulunabildiği veritabanlarına "ilişkisel veritabanı" diyoruz. Bu çok basit bir tanım. İlişkisel Veritabanlarını daha sonra ayrı bir konu başlığı altında incelemeliyiz.

Bir veritabanı yönetim sistemi (DBMS: DataBase Management System), kitaplıklar uygulamalar ve yardımcı programların birleşmesinden oluşur ve verilerin saklanması ve yönetilmesi ile ilgili konulardaki ayrıntılardan veritabanı yöneticilerini kurtarır. Aynı zamanda, kayıtların güncellenmesi ve kayıtlar üzerinde araştırma yapılması da mümkündür.

SQL :

İlişkisel veri tabanı yönetim sistemleri (RDBS) modeli ilk önce 1970 yılında Dr.E.F. Codd tarafından tarif edilmiştir. Structured English Query Language (SEQUEL), IBM tarafından Codd?un modeli kullanılmak için geliştirilmiş olup daha sonra adı SQL olarak değişmiştir. Bugün SQL, ilişkisel veri tabanı yönetim sistemleri standartı olarak kabul edilmektedir. Oracle, SQL standartlarının gelişmesinde en önemli rolü oynayan bir kurum olup, SQL standartlarına uygundur.

SQL ilişkisel veri tabanlarindaki tüm kullanicilarin ve uygulamalarin veri tabanina erişmek için kullandiklari komutlar bütünüdür.

SQL komutları ile ,
? Bir veya daha fazla tablodan Veri sorgulama,
? Bir tabloya kayıt ekleme değiştirme ve silme,
? Veri tabanı nesnesi yaratma, değiştirme ve silme
? Veri tabanına ve nesnelerine erişimi kontrol etme
? Veri tabanı bütünlüğünü ve tutarlılığını sağlama işlemleri yapılabilmektedir.

TABLE: Database de saklanan veriler kümesidir. Herhangi bir tipi yoktur.
ROW : Table üzerindeki tek bir satırı ifade eder.
COLUMN : Tablodaki sütunları ifade eder. "Telefon Column", telefon sütunundaki tüm verileri ifade eder.
FIELD : Tablodaki tek bir satır ve tek bir sütunu başka bir deyişle tek bir hücreyi ifade eder.
PRIMARY KEY :Tablodaki tekrarlanmayan sütunu ifade eder. bu sütunda aynı kayıt 2 kez girilemez.
SEQUENCE : Primary key gibi alanlarda kullanabileceğiniz artan ve tekrarlamayan sayı üreten oracle özel tablosudur.
Access ve Microsoft SQL Server´daki Primary key sütunları için otomatik sayı özelliği yerine, oracle´da SEQUENCE tablodan sayı alınıp primary key sütununa manuel yazılacaktır.
VİEW : Bir ya da birkaç tablodan istenilen alanların alınmasıyla oluşturulan sanal bir tablodur. View, bu tablolar üzerinde gerçekleştirilen bir SQL sorgu sonucu oluşturulur. Bir view üzerinde silme, güncelleme gibi işlemler yapılamaz. Çünkü view oluşturulduğu tabloların sadece o anlık görüntüsüdür ve veritabanında kendi tanımının kapladığı yer haricinde yer kaplamaz. uzun ve karışık veritabanı sorgulamaları için kullanılır.

SQL_NET: Oracle veritabanı ile kullanıcı arasındaki iletişimi sağlar.

RDBMS : Oracle´ın server tarafındaki Client/Server destekli iletişim protokoludür. Hızlı ve son derece güvenli bir erişim sağlar.

TCP/IP : Oracle´ın server tarafındaki IP numaraları sayesinde client / server mimarisi iletişim protokolüdür.

SQL*PLUS: Oracle komutlarının, SQL cümlelerinin, mantıksal döngülerin çalıştırılabileceği oracle komut penceresidir.

PL/SQL : Çok güçlü ve kullanışlı bir oracle editörü diyebiliriz. TABLE (new, insert,update,delete), SEQUENCE, VİEW, BACKUP v.s. gibi tüm veritabanı işlemleri için kullanılabilir.

NET8 : Farklı bilgisayarların veritabanına bağlantı kurması ve server-client arasında veri alışverişinin sağlanabilmesi Net8´in ana görevidir. Net8 ağdaki oracle´a bağlanılacak her bilgisayara (Oracle Client uygulamasıyla) kurulur. Ağ bağlantısı sağlandığında NET8 istemci ile sunucu arasında bir veri taşıyıcısı gibi işlem görür. Ağ üzerinde bir istemcinin sunucudaki veritabanına erişebilmesi için, sunucuda bir ağ servis adının(Net Service Name) ve bir dinleyicinin(LISTENER) oluşturulması gerekir (Oracle Server kurulumu ve kurulumun son aşamasında database create işleminde oluşur).

Tnsnames.ora : oracleORAX.X etworkAdmin klasöründe bulunur. Database Host name ve Servicename bilgilerini içerir.

ORACLE VERİ TİPLERİ :

CHAR(karakterSayisi) : Maximum 255 karakterlik sabit uzunluktaki alfanümerik verilerin tutulabileceği alandır.
DATE : tarih ve saat tutan alandır. Ülke kodu desteği vardır. Standart olan veri tipi DD-MON-YY (31-JUL-05)dir.
MSLABEL : Trusted Oracle?da kullanılan işletim sistemine ait binary dosyadır.
NUMBER (toplam,ondalık) : Sayısal verilerin tutulduğu alanlar için kullanılır. İlk hane toplam karakter sayısını(ondalık dahil), ondalık bölümü ise ondalık kısmın uzunluğunu belirtir.
NUMBER(hane) : Ondalık içermeyen tam sayılar için kullanılan veri tipidir.
NUMBER : herhangi bir sayı girilmeden belirtilen sayısal alan tipidir. Tavsiye edilmemekle birlikte, oracle tarafından desteklenen maximum sayısal değere kadar veri girilebilir.
VARCHAR2 (sayı): Maximum 4000 karakterli değişken uzunluktaki alfanümerik dataların tutulabildiği alanlar için kullanılır.
LONG : 2 GB? a kadar karakter bilgi tutabilen bir alan türüdür. Bir tabloda birden fazla long veri tipine sahip alan olamaz. Bu alan üzerinde indeks oluşturulamaz. (*WHERE *GROUP BY * ORDER BY * DISTINC * CREATE CLUSTER *CREATE TABLE AS SELECT *SUBSTR, INSTR gibi SQL cümlelerinde kullanılamaz.)
LONG RAW : 2 GB? a kadar binary bilgi tutabilen alanlar için kullanılır.
RAW (sayı) : Maksimum 255 byte?a kadar bilgi tutabilen binary alanlar için kullnılır.
ROWID : Oracle´ın, tablodaki her bir satır için oluşturduğu sıra numarasıdır. Oracle tarafından otomatik oluşturulur.

Oracle veritabanına erişebilmek için bilgisayarımızda Oracle Client uygulamasının kurulu olması gerekmektedir. Oracle Client ile gelen Net8 Configuration Asistant uygulaması kullanılarak Client?ten Servera bağlantı sağlanır. Biz uygulamalarımızda direkt servera değil makinemızdaki Net8 uygulamasına bağlanmaktayız.

7 Ağustos 2008 Perşembe

TSQL-> SQL 2005 te WEB Servisi oluşturuyoruz 1



USE master

--Sisteme ie ile bağlandığımızda bize kullanıcı soracak.Onu create ediyoruz.
CREATE LOGIN
endpoint_owner
WITH
password='pwd'

-- Bakalım yapabilmiş miyiz?
SELECT NAME FROM master.dbo.syslogins

--Veri çekeceğimiz procedure
CREATE PROCEDURE dbo.usp_getContext
AS
BEGIN
SELECT SUSER_NAME() AS 'LOGIN', USER_NAME() AS 'USER NAME'
END

--Eğer soap_endpoint diye bir noktamız varsa silelim.
DROP ENDPOINT soap_endpoint

--Yeniden oluşturalım
CREATE ENDPOINT
soap_endpoint
AUTHORIZATION
endpoint_owner
STATE = STARTED
AS HTTP
(
PATH = '/sql',
AUTHENTICATION = (ntlm), --{ BASIC | DIGEST | INTEGRATED | NTLM | KERBEROS }
/* BASIC : SSL gerektirmektedir ve Base64 ile encode edilmiş virgül ile ayrılmış
kullanıcı adı ve parola bilgilerini kapsayan bir authentication header içermektedir.

DIGEST : Talep sunucuya gönderilmeden önce kullanıcı adı ve parola MD5 ile şifrelenir.
Sunucunun hem parolaya hem de MD5 hashine erişimi olduğu için doğrulama yapmak amacıyla
istemci tarafından sağlanan verileri karşılaştırma imkanı vardır.
Bu sayede istemci sunucuya, gerçek parolayı vermeden, gerçek parolayı bildiğini ispat edebilmektedir.

INTEGRATED : Sunucu önce Kerberos ile kimlik doğrulama yapmaya çalışır.
İstemcinin Kerberos'u desteklemiyor olması veya negotiation'ın mümkün olmaması durumunda, authentication NTLM'e döner.

NTLM : Windows 95, 98 ve NT 4.0 tarafından desteklenen bir authentication metodudur.
NTLM'de BASIC ve DIGEST'e göre daha güvenli ve aşılması zor bir yapıya sahiptir.
NTLM, Windows 2000 ve sonraki sürümlerde bir Security Support Provider Interface (SSPI) ile sunulmaktadır.

KERBEROS : Internet için standart bir mekanizmadır. Windows 2000 ve sonraki sürümlerde bir SSPI ile desteklenmektedir.
*/
PORTS = (clear),
SITE = '*'
)
FOR SOAP
(
WEBMETHOD 'GetContext'
(
name='master.dbo.usp_getContext'
),
WSDL = DEFAULT,
SCHEMA = STANDARD,

/*Kullanıcının kimliği doğrulandıktan sonra kullanıcı CREATE ENDPOINT ifadesinde yer alacak DATABASE
özelliği ile spesifik bir veritabanına yönlendirilebilir. */
DATABASE = 'master',

NAMESPACE = 'http://tempUri.org/',
LOGIN_TYPE = WINDOWS
);

--Bilgisayarımızda users altında tanımlı bir kullanıcıyı oluşturuyoruz.
CREATE LOGIN
[CNU6261Y11\soap_test]
FROM WINDOWS

SELECT * FROM master.dbo.syslogins

Endpoint imize bağlanabilsin diye yetkilendirelim
GRANT
CONNECT
ON
ENDPOINT::soap_endpoint
TO
[CNU6261Y11\soap_test]




------------------------------------ SIFIRDAN BİR TANE DAHA ----------------

-- Varsa silelim ENDPOINT imizi tekrar oluşturmadan önce
DROP ENDPOINT EuclidParametreleri
-- Varsa silelim kullanıcımızı tekrar oluşturmadan önce
DROP LOGIN [medula\endpointOwner]

/*
Windows içinde bir kullanıcı oluşturuyoruz.
NTLM yapacağımız için.
Kullanıcı adı: endpointOwner olacak.
*/

/*
SQL içinde de bu kullanıcıyı işaret ederek oluşturuyoruz.
Unutmayalım ki bu kullanıcıya SQL içinden bizim DB ye public
dbOwner gibi yetki vermezsek
There was an error in the incoming SOAP request packet: Client, LoginFailure, AccessDenied
hatası alırız.
*/
CREATE LOGIN
[medula\endpointOwner]
FROM WINDOWS
go


/*
ENDPOINT imizi oluşturuyoruz.
*/
CREATE ENDPOINT
EuclidParametreleri
-- Kullanıcımızı bu Endpoint e yetkili ilan edelim.
AUTHORIZATION
[medula\endpointOwner]
-- Durumunu BAŞLATILDI olarak ayarlayalım ki hemen çalışsın
STATE=STARTED
-- HTTP üzerinden çalışacak (TCP de olabilirdi)
AS HTTP
(
-- Demiştim, NTLM olacak ki Windows kullanıcımız işe yarasın
AUTHENTICATION = (NTLM),
-- http://sunucuAdi/sql/EuclidParametreleri?wsdl ile erişeceğiz
PATH = '/sql/EuclidParametreleri',
-- NTLM olduğu için CLEAR, BASIC olsaydı SSL olmak zorundaydı
PORTS = (CLEAR)
)
FOR SOAP
(
-- Metodumuzun adı
WEBMETHOD 'parametreler'
(
-- Tetikleyeceği Function ya da Procedure adı
NAME = 'EuclidLabImport.dbo.testOrtamiParametreleri'
),
-- WSDL olsun lütfen
WSDL = DEFAULT,
-- İlgileneceği VT adını girelim
DATABASE = 'EuclidLabImport'
)
go

-- Başka kullanıcılardan bu EndPointimize olan yetkilerini almak için
REVOKE CONNECT ON ENDPOINT::EuclidParametreleri FROM [medula\endpointOwner];

-- Başka kullanıcılara bu EndPointimize yetki vermek için
GRANT CONNECT
ON
ENDPOINT::EuclidParametreleri
TO
[medula\endpointOwner]
GO

TSQL-> Kullanıcı oluştur. Database Kullanıcılarını getir. Kritere uyarsa Sil.



USE master
-- Kullanıcı oluşturuyoruz.
CREATE LOGIN
endpoint_owner
WITH
PASSWORD='pwd'
GO

CREATE

CREATE PROCEDURE Dbo.usp_getcontext
As
SELECT SUSER_NAME() as 'LOGIN', USER_NAME() AS 'USER NAME'
go

USE master
-- Kullanıcı oluşturuyoruz.
CREATE LOGIN
endpoint_owner
WITH
PASSWORD='pwd'
GO

SELECT SYSTEM_USER as 'SYSTEM USER' , SUSER_NAME() as 'LOGIN', USER_NAME() AS 'USER NAME'

IF EXISTS( SELECT NAME FROM master.dbo.syslogins WHERE NAME='endpoint_owner' )
DROP LOGIN endpoint_owner

SELECT NAME, LOGINNAME
FROM master.dbo.syslogins
WHERE NAME='endpoint_owner'

TSQL-> IF EXISTS DROP



IF EXISTS (SELECT * FROM [dbo].[sysobjects]
WHERE ID = object_id(N'[schema].[procedure]') AND
OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE [schema].[procedure]
GO
CREATE PROCEDURE [schema].[procedure]
AS
BEGIN