You can use
select * from table t where
(param1 is null or t.column1 = param1) and
(param2 ....)
But this will NOT use any indices on the table or, in the worst case, use an inappropriate one (due cursor sharing, can't be avoided before 11G. In 11G it sometimes may work but it is not something you should rely on).
To get a better solution you have to use a dynamic query. In PLSQL this is done using execute immediate l_query; (or open cursor for l_query;) for most situations or via more powerfull (but much more complex to use) DBMS_SQL (required in very limited number of occurences).
Simpler (but using literals and therefore requiring a hard parse virtually any time it is run) solution is
procedure dynamic_query_literals (param1 ... param7)
is
l_query varchar2(1000);
l_cursor sys_refcursor;
begin
l_query := 'select * from table t where 1=1';
if (param1 is not null) then
l_query := l_query || ' and t.column1 = param1';
end if;
if (param2 ...)
open l_cursor for l_query;
-- do whatever needed with the result set in the cursor.
--The procedure can even return this cursor...
end;
More complex but more performant (particularly if this procedure is called MANY times) solution requires binding of parameters (which gets done automatically and transparently when you use static sql in plsql)
procedure dynamic_query_binding (param1 ... param7)
is
l_query varchar2(1000);
l_cursor sys_refcursor;
begin
l_query := 'select * from table t where 1=1';
if (param1 is null) then
--this will get optimised away in the process but is required
--syntactically for use of "using" later
l_query := l_query || ' and 1=1 or :param1 is null';
else
l_query := l_query || ' and t.column1 = :param1';
end if;
if (param2 ...)
open l_cursor for l_query
using param1, param2, ... param7;
-- do whatever needed with the result set in the cursor.
-- The procedure can even return this cursor...
end;
This version will use indices on the table as appropriate and still get only one hard parse per unique combination of "nullacy" of parameters.
The downside of both dynamic version is that you don't get compile time syntax checking.